无法使用杰克逊反序列化器反序列化java.awt.color [英] Unable to deserialize java.awt.color using jackson deserializer
问题描述
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屋!