[英]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 Integer
、 instanceof Map
來判斷類型。
您只需要像這樣簡化 class :
public class Operation {
@JsonProperty("operation_rand")
private Map operationDetails;
public Map getOperation() {
return operationDetails;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.