[英]json to java hashmap using complex key
我目前正在開發一個應用程序,其中需要將HashMap<Object1, Object2>
序列化為JSON,然后從JSON反序列化為相同的“ HashMap”。
我可以使用通常的映射器並覆蓋Object1
的toString()
方法來Object1
進行Object1
。
public String toString(){
String res = Object1.elem1 + ";" + Object1.elem2;
return res
}
然后,我可以進行序列化並獲取預期的json(其中res是我定義的String,在此之前更容易不將其全部寫回)。*
{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的新手,如果可以詳細回答,我們將非常高興。
您可以創建自己的序列化格式,而不必使用toString()。 如果您在Map中沒有非基本鍵,則可以將Map序列化為
[
{
"key": <serialized key>,
"value: <serialized value>
},
....
]
在這種情況下,您的Serializer和Deserializer將如下:
public class CustomSerializer extends StdSerializer<Map<Object1, Object2>> {
protected CustomSerializer() {
super(Map.class, true);
}
@Override
public void serialize(Map<Object1, Object2> map,
JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException{
jsonGenerator.writeStartArray();
for (Map.Entry<Object1,Object2> element: map.entrySet()) {
jsonGenerator.writeStartObject();
jsonGenerator.writeObjectField("key", element.getKey());
jsonGenerator.writeObjectField("value", element.getValue());
jsonGenerator.writeEndObject();
}
jsonGenerator.writeEndArray();
}
}
和
public class CustomDeserializer extends StdDeserializer<Map<Object1, Object2>> {
protected CustomDeserializer() {
super(Map.class);
}
@Override
public Map<Object1, Object2> deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException {
Map<Object1, Object2> result = new HashMap<>();
JsonNode node = jsonParser.getCodec().readTree(jsonParser);
for (JsonNode element : node) {
result.put(
jsonParser.getCodec().treeToValue(element.get("key"), Object1.class),
jsonParser.getCodec().treeToValue(element.get("value"), Object2.class)
);
}
return result;
}
}
因此,您可以使用您的字段和另一個Map創建類(用於檢查具有不同類型的map是否照常工作):
public class MapWrapper {
@JsonSerialize(using = CustomSerializer.class)
@JsonDeserialize(using = CustomDeserializer.class)
private Map<Object1, Object2> map = new HashMap<>();
private Map<String, String> someMap = new HashMap<>();
// default constructor, getters, setters
}
序列化值可以是:
{
"map": [
{
"key": {
"elem1": "qqq",
"elem2": "rrr"
},
"value": {
"fieldFromValue": "xxx"
}
},
{
"key": {
"elem1": "qqq_two",
"elem2": "rrr_two"
},
"value": {
"fieldFromValue": "yyy"
}
}
],
"someMap": {
"key1": "value1"
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.