gpt4 book ai didi

java - Map 中的 Jackson java.util.Date 值(反)序列化

转载 作者:搜寻专家 更新时间:2023-11-01 02:36:29 28 4
gpt4 key购买 nike

考虑这个属性

@JsonProperty
private Map<String, Object> myMap;

当一个包含 java.util.Date值只要序列化,就不会反序列化为Date再次因为 Map<String, Object> 中不存在类型信息.我怎样才能绕过这个问题?我阅读了有关 this question 的答案这将是一种解决方法,但无法区分包含日期的字符串和在 map 中序列化为字符串的日期。 我可以告诉 Jackson 包含每个映射值的类型信息,以便 Jackson 可以正确反序列化它们吗?

最佳答案

实现自定义反序列化器并将注释 @JsonDeserialize(using = DateDeserializer.class) 添加到您的字段。

看看这个例子:

你的 Json-Bean:

public class Foo {

private String name;

@JsonProperty
@JsonDeserialize(using = DateDeserializer.class)
private Map<String, Object> dates;

[...] // getter, setter, equals, hashcode
}

反序列化器:

public class DateDeserializer extends JsonDeserializer<Map<String, Object>> {

private TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {};

@Override
public Map<String, Object> deserialize(JsonParser p, DeserializationContext ctxt, Map<String, Object> target) throws IOException, JsonProcessingException {

Map<String, Long> map = new ObjectMapper().readValue(p, typeRef);

for(Entry<String, Long> e : map.entrySet()){

Long value = e.getValue();
String key = e.getKey();

if(value instanceof Long){ // or if("date".equals(key)) ...
target.put(key, new Date(value));
} else {
target.put(key, value); // leave as is
}

}

return target;
}

@Override
public Map<String, Object> deserialize(JsonParser paramJsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return this.deserialize(paramJsonParser, ctxt, new HashMap<>());
}

}

简单测试:

public static void main(String[] args) throws Exception {

Foo foo1 = new Foo();
foo1.setName("foo");
foo1.setData(new HashMap<String, Object>(){{
put("date", new Date());
put("bool", true);
put("string", "yeah");
}});
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(foo1);
System.out.println(jsonStr);
Foo foo2 = mapper.readValue(jsonStr, Foo.class);

System.out.println(foo2.equals(foo1));

}

关于java - Map<String, Object> 中的 Jackson java.util.Date 值(反)序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302050/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com