无法使用 jackson deserializer 反序列化 java.awt.color

Car*_*vus 4 java serialization json jackson deserialization

  public class TestJacksonColor {
        public static void main(String [] args) throws IOException {
            ObjectMapper objectMapper = new ObjectMapper();
            Color black = new Color(0, 0, 0);
            String json = objectMapper.writeValueAsString(black);
            Color backToObject = objectMapper.readValue(json, Color.class);
        }
    }
Run Code Online (Sandbox Code Playgroud)

该代码尝试使用 jackson objectmapper 将 java.awt.color 类序列化。获取生成的 json 字符串并将其反序列化回 java.awt.color 类。但是,在进行反序列化时,会发生以下错误。

线程“main”com.fasterxml.jackson.databind.JsonMappingException 中的异常:找不到适合类型 [简单类型,类 java.awt.Color] 的构造函数:无法从 JSON 对象实例化

tep*_*pic 6

您将需要一个自定义序列化器和反序列化器。周围有一些预先构建的模块,但我不知道有一个处理java.awt.Color.

这是一个定义序列化器/反序列化器对并注册一个模块来处理Color对象的示例:

public class JacksonColorTest {

    public static class ColorSerializer extends JsonSerializer<Color> {
        @Override
        public void serialize(Color value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeStartObject();
            gen.writeFieldName("argb");
            gen.writeString(Integer.toHexString(value.getRGB()));
            gen.writeEndObject();
        }
    }

    public static class ColorDeserializer extends JsonDeserializer<Color> {
        @Override
        public Color deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            TreeNode root = p.getCodec().readTree(p);
            TextNode rgba = (TextNode) root.get("argb");
            return new Color(Integer.parseUnsignedInt(rgba.textValue(), 16), true);
        }
    }

    public static void main(String [] args) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(Color.class, new ColorSerializer());
        module.addDeserializer(Color.class, new ColorDeserializer());
        objectMapper.registerModule(module);

        Color testColor = new Color(1, 2, 3, 4);
        String json = objectMapper.writeValueAsString(testColor);
        Color backToObject = objectMapper.readValue(json, Color.class);

        if (!testColor.equals(backToObject)) {
            throw new AssertionError("round trip failed");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)