我如何使用 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);
我试图找到一个示例,但没有找到如何将 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);