【发布时间】:2017-01-04 09:49:21
【问题描述】:
我目前正在开发一个需要序列化
HashMap<Object1, Object2> 转换为 JSON,然后从 JSON 反序列化为相同的 `HashMap'。
我可以使用通常的映射器对其进行序列化,并覆盖Object1 的toString() 方法。
public String toString(){
String res = Object1.elem1 + ";" + Object1.elem2;
return res
}
然后我可以序列化并获得预期的 json(其中 res 是我之前定义的字符串,更容易不写回它)。*
{res : Object2JsonRepresentation}
然后我想反序列化,所以我使用自定义keyDeserializer:
@XmlElement(name="myMap")
@JsonDeserialize(keyUsing = Object1KeyDeserializer.class)
public HashMap <Object1,Object2> myMap = new HashMap <>();
还有Object1KeyDeserializer:
public class Object1KeyDeserializer extends KeyDeserializer{
@Override
public Object1 deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {
String[] parts = key.split(";");
System.out.println(key);
Elem elem1 = new Elem(parts[1]);
Elem elem2 = new Elem(parts[2]);
Object1 obj = new Object1(elem1,elem2);
return obj;
}
}
尽管如此,keyDeserializer 似乎从未被调用过,你能解释一下原因吗?我对 JSON 很陌生,如果可以详细回答我会很高兴。
【问题讨论】:
-
添加注释本身通常是不够的。您需要在构建中的某个地方配置一些插件来获取注释并完成工作。请提供有关您如何构建应用程序的更多详细信息。
-
嗯,它是开发环境中更大应用程序的一部分,构建工作是使用 gradle 完成的。对于 json,我使用 ObjectMapper 和 writeValueAsString。要反序列化我做 mapper.readValue(jsonString, type)
-
@AdriaanKoster 有什么运行时注释应该由 Jackson 在运行时评估以更改构建?注释不仅可以用于在构建时生成内容。
-
谢谢你的回答,不过我不太明白我们要去哪里。
-
在构建中,通常会指定存在哪些依赖项以及将哪些插件和处理器应用于项目生命周期。如果 @JsonDeserialize 注释没有按预期被拾取,我将开始查看构建以查看是否缺少任何内容。
标签: java json hashmap key deserialization