无法使用杰克逊反序列化器反序列化java.awt.color [英] Unable to deserialize java.awt.color using jackson deserializer

查看:115
本文介绍了无法使用杰克逊反序列化器反序列化java.awt.color的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  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);
        }
    }

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

The code attempts to take an java.awt.color class serialize it using jackson objectmapper. Take the resulting json string and deserialize it back to an java.awt.color class. However when doing the deserialization the following error occurs.


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

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class java.awt.Color]: can not instantiate from JSON object


推荐答案

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

You'll need a custom serializer and deserializer. There are some pre-built modules around, but I'm unaware of one that handles java.awt.Color.

下面是一个示例,它定义了序列化器/解串器对,并注册了一个模块来处理 Color 对象:

Here's an example that defines the serialiser/deserializer pair and registers a module to handle Color objects:

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");
        }
    }
}

这篇关于无法使用杰克逊反序列化器反序列化java.awt.color的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆