当前位置: 首页 > 知识库问答 >
问题:

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

夏朗
2023-03-14
  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对象映射器对其进行序列化。获取生成的json字符串并将其反序列化回java.awt.color类。但是在进行反序列化时会出现以下错误。

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

共有1个答案

舒枫涟
2023-03-14

您需要一个自定义序列化器和反序列化器。周围有一些预构建的模块,但我不知道有一个处理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");
        }
    }
}
 类似资料:
  • 我想将json反序列化到类Foo: IBar有两个实现,但是当反序列化时,我总是想使用第一个实现。(理想情况下,这将使问题变得更容易,因为不需要运行时类型检查) 我相信我可以编写自定义反序列化程序,但我觉得一定有更简单的方法。 我找到了这个注释,它在没有列表的情况下非常有效。

  • 问题内容: 我正在尝试使用Jackson将json数据转换为POJO对象。这是MainActivity和我的POJO类代码。我基本上收到了JsonMappingException错误。我还附上了整个日志。 MainActivity.java: Entries.java(这是POJO) 现在,我的日志中出现以下错误。因此,我无法继续工作。这是日志: 问题答案: 在 条目* 和 电话中 删除构造函数

  • 我正在阅读Facebook的洞察,并试图让Jackson将JSON映射到Object。如果所有的数据都不是空的,我就会让它正常工作。但是我在尝试反序列化键值的空数组时遇到了问题。即使尝试了这篇文章:如何防止Map内部的null值和bean内部的null字段通过Jackson序列化,也没有解决问题:( 这是JSON: 我的代码段如下: 全堆栈跟踪:

  • 问题:假客户机对返回的Spring boot Rest API进行API调用时,无法反序列化该页的属性。 Spring Boot:2.3.3.发布 春云假:2.2.5.发布 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造的实例(没有像默认构造函数一样的创建者存在):无法从[源:(BufferedReader);行

  • 我正在尝试将我的代码 Json 数组中的这个 元素反序列化为自定义类..但我不能: 这是类: 但是我收到此错误: com.fasterxml.jackson.databind.exc.MismatchedInputException: START_ARRAY无法从 [Source: UNKNOWN; line: -1, column: -1] at com.fasterxml.jackson.da