【问题标题】:Jackson parse JSON to Map<String, TypeA>Jackson 将 JSON 解析为 Map<String, TypeS>
【发布时间】:2015-01-09 09:25:17
【问题描述】:

我有以下 JSON:

{  
    "data": {  
        "1": {  
            "id":"1",  
            "name":"test1"  
         },  
        "2": {   
            "id":"2",  
            "name":"test2"  
         }  
    }  
}  

我想用杰克逊将“数据”解析成一个对象。如果我将其解析为Map&lt;String, Object&gt;,则效果很好,而将“1”、“2”(...) 用作 Key,并将相应的数据作为值,再次由 Map 表示。

现在我想将此 JSON 解析为 Map&lt;String, TypeA&gt;,而 TypeA 类将有两个字段,id 和 name。

有人可以给我一个提示吗? 我总是收到以下错误:

无法读取 JSON:没有为类型 [simple] 找到合适的构造函数 type, class TypeA]: 不能从 JSON 对象实例化(需要 添加/启用类型信息?)

非常感谢,
锄头

【问题讨论】:

    标签: java json dictionary jackson deserialization


    【解决方案1】:

    以下内容应该适合您。

    public class MyDataObject {
        private final Map<String, TypeA> data;
    
        @JsonCreator
        public MyDataObject(@JsonProperty("data") final Map<String, TypeA> data) {
            this.data = data;
        }
    
        public Map<String, TypeA> getData() {
            return data;
        }
    }
    
    public class TypeA {
        private final String id;
        private final String name;
    
        @JsonCreator
        public TypeA(@JsonProperty("id") final String id, 
                     @JsonProperty("name") String name) {
    
            this.id = id;
            this.name = name;
        }
    
        public String getId() {
            return id;
        }
    
        public String getName() {
            return name;
        }
    }
    

    @JsonCreator 用于描述如何创建对象以及属性名称@JsonProperty。即使它们是嵌套的。

    反序列化整个事情:

    ObjectMapper mapper = new ObjectMapper();
    final MyDataObject myDataObject = mapper.readValue(json, MyDataObject.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2011-02-01
      相关资源
      最近更新 更多