簡體   English   中英

使用復雜鍵將json轉換為Java hashmap

[英]json to java hashmap using complex key

我目前正在開發一個應用程序,其中需要將HashMap<Object1, Object2>序列化為JSON,然后從JSON反序列化為相同的“ HashMap”。

我可以使用通常的映射器並覆蓋Object1toString()方法來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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM