我如何使用 Jackson 将 javafx.scene.paint.Color 与 JSON 相互转换

How can I use Jackson to convert a javafx.scene.paint.Color to and from JSON

我试图找到一个示例,但没有找到如何将 javafx.scene.paint.Color JSON 重新构造回 POJO 的方法。

当我创建 JSON 时,Color.RED 变成了这个:

{
  "annotationText" : "5/5/2015 12:18 PM",
  "pageNumber" : 0,
  "textColor" : {
  "red" : 1.0,
  "green" : 0.0,
  "blue" : 0.0,
  "opacity" : 1.0,
  "opaque" : true,
  "brightness" : 1.0,
  "hue" : 0.0,
  "saturation" : 1.0
  },
"fillColor" : null
}

我不确定如何重新解析它以便将 Color.RED 放回我的 POJO 上的 textColor 字段。

任何指点将不胜感激。

谢谢!

根据上面的评论 - 我能够让它像这样工作:

public class AnnotationDeserializer extends JsonDeserializer<AnnotationDetail>{

    @Override
    public AnnotationDetail deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException {
        AnnotationDetail detail = new AnnotationDetail();

        JsonNode node = jp.getCodec().readTree(jp);

        detail.setAnnotationText(node.get("annotationText").asText());
        detail.setPageNumber((Integer) ((IntNode) node.get("pageNumber")).numberValue());

        JsonNode textColorNode = node.get("textColor");
        double red =(Double) ((DoubleNode) textColorNode.get("red")).numberValue();
        double green = (Double) ((DoubleNode) textColorNode.get("green")).numberValue();
        double blue = (Double) ((DoubleNode) textColorNode.get("blue")).numberValue();
        double opacity = (Double) ((DoubleNode) textColorNode.get("opacity")).numberValue();

        detail.setTextColor(new Color(red, green, blue, opacity));
        return detail;
    }
}

要反序列化纯 JavaFX Color 对象,您可以使用:

public class ColorDeserializer extends JsonDeserializer<Color> {

    @Override
    public Color deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonNode node = p.getCodec().readTree(p);
        double red = node.get("red").doubleValue();
        double green = node.get("green").doubleValue();
        double blue = node.get("blue").doubleValue();
        double opacity = node.get("opacity").doubleValue();

        return new Color(red, green, blue, opacity);
    }

}

而且你必须在你的模块中注册解串器:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Color.class, new ColorDeserializer());
mapper.registerModule(module);

Color readValue = mapper.readValue(json, Color.class);