【问题标题】:How I parse Color java class to JSON with Jackson?如何使用 Jackson 将 Color java 类解析为 JSON?
【发布时间】:2020-03-14 00:59:33
【问题描述】:

我正在尝试使用 JacksonJSON 反序列化 Color 类,但它会引发异常:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 无法识别的字段“colorSpace”(java.awt.Color 类),未标记为 可以忽略。

我做错了什么? 这是我的代码:

File act = new File(new File().getAbsolutePath());

ObjectMapper om = new ObjectMapper();
File f = new File(act, "123.JSON");

om.writeValue(f, new person());
person per = om.readValue(f, person.class);
System.out.println(per);

这是我的person类:

public class person implements Serializable {
    //it include getters, setters and builder

   String nombe = "Pepe";
   String CI = "12345678978";
   Color c = Color.red;
}

【问题讨论】:

  • 这看起来像是可以转换成minimal reproducible example 的代码,几乎不需要额外的工作:你能做到吗? (即显示人们可以复制和粘贴的单文件代码,然后无需任何额外工作即可通过 javac 运行?)
  • 同时显示你正在解析的 JSON。
  • json 中调用的字段最有可能称为“colorSpace”,而您的字段称为“c”...

标签: java json jackson awt json-deserialization


【解决方案1】:

java.awt.Color 类不是常规的 POJOEnum。如果要将其存储为JSON 格式,则需要实现自定义序列化器和反序列化器。 Color 类可以通过它的RGB 表示来表示,您可以将其存储为一个数字:

class ColorJsonSerializer extends JsonSerializer<Color> {

    @Override
    public void serialize(Color value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (value == null) {
            gen.writeNull();
            return;
        }
        gen.writeNumber(value.getRGB());
    }
}

class ColorJsonDeserializer extends JsonDeserializer<Color> {

    @Override
    public Color deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return new Color(p.getValueAsInt());
    }
}

简单用法:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;

import java.awt.*;
import java.io.IOException;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        SimpleModule awtModule = new SimpleModule("AWT Module");
        awtModule.addSerializer(Color.class, new ColorJsonSerializer());
        awtModule.addDeserializer(Color.class, new ColorJsonDeserializer());

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(awtModule);

        String json = mapper.writeValueAsString(new Person());
        System.out.println(json);

        System.out.println(mapper.readValue(json, Person.class));
    }
}

上面的代码打印:

{"nombe":"Pepe","c":-65536,"ci":"12345678978"}
Person{nombe='Pepe', CI='12345678978', c=java.awt.Color[r=255,g=0,b=0]}

看看Color 存储为JSON 对象的类似问题:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多