簡體   English   中英

使用嵌套屬性反序列化 JSON Object

[英]Deserialize JSON Object with nested attributes

我正在嘗試使用屬性反序列化 json object

其中第一個鍵名未知,而內部 map 始終包含名為“key1”和“key2”的兩個屬性。

{
   "operation_rand":
   {
      "key1": 1005, 
      "key2": 5
   }
}

我有代碼:

操作.java

public class Operation {
    private Map<String, Map<String, Integer>> operationDetails = new HashMap<>();
    
    @JsonAnyGetter
    public Map<String, Map<String, Integer>> getOperation() {
        return operationDetails;
    }
} 

主要的

ObjectMapper mapper = new ObjectMapper();
   
Operation op = mapper.readValue(jsonData, Operation.class); 
Map<String, Map<String, Integer>> oDetails = address.getOperation();

但是我收到錯誤: Can not deserialize instance of java.lang.String out of START_OBJECT token ,這是內部 map 開始的地方。

關於我如何 map 內部 map 的任何想法? 如果 map 只有一層深,我可以獲取正確的值。

{
   "operation_rand": 100
}

並將上面的地圖調整為Map<String, Integer>

對於預期的 JSON 和 Gson 依賴項,您需要一個 Object 表示

Class 為 Object


    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonRootName;

    @JsonRootName("operation_rand")
    public class OperationRand{
    @JsonProperty("key1")
    private int key1;
    @JsonProperty("key2")
    private int key2;

    public int getKey1() {
        return key1;
    }

    public void setKey1(int key1) {
        this.key1 = key1;
    }

    public int getKey2() {
        return key2;
    }

    public void setKey2(int key2) {
        this.key2 = key2;
    }

    public OperationRand(int key1, int key2) {
        this.key1 = key1;
        this.key2 = key2;
    }

    @Override
    public String toString() {
        return "OperationRand{" +
                "key1=" + key1 +
                ", key2=" + key2 +
                '}';
    }
    }

Gson 來自谷歌

    <dependency>

        <groupId>com.google.code.gson</groupId>

        <artifactId>gson</artifactId>

    </dependency>

然后,

    String json ="{\n" +
                "   \"operation_rand\":\n" +
                "   {\n" +
                "      \"key1\": 1005, \n" +
                "      \"key2\": 5\n" +
                "   }\n" +
                "}";
    Gson gson = new Gson();
    OperationRand res = gson.fromJson(json, OperationRand.class);

    System.out.println(res);
    

[編輯]對於 Changing operation_rand 我會使用 object 作為不變的字段


    import lombok.*;
    
    @Setter
    @Getter
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    public class Key {
    int key1;
    int key2;
    }

在主要


    Gson gson = new Gson();
    Map<String,Key> rest = gson.fromJson(json,HashMap.class);
    System.out.println(rest);

100 不是 Map<String, Integer>。

也許使用Map<String,Object>而不是Map<String, Map<String, Integer>>

通過instanceof Integerinstanceof Map來判斷類型。

您只需要像這樣簡化 class :

public class Operation {
    @JsonProperty("operation_rand")
    private Map operationDetails;
    
    public Map getOperation() {
        return operationDetails;
    }
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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