【问题标题】:I need to deserialize a JSON array to a HashMap with jackson我需要用杰克逊将 JSON 数组反序列化为 HashMap
【发布时间】:2021-05-16 04:05:56
【问题描述】:

我有一个需要反序列化为 HashMap 的 json 文件。

我需要一个 {name, HashMap} 类型的 HashMap

示例:{aaa={value1=111, value2=222, value3=333}, bbb={value1=444, value2=555, value3=666}}

不幸的是,我是 json 和 jackson 的新手。

提前谢谢你。

这是我的json

[
    {
        "name": "aaa",
        "values" : {
            "value1" : 111,
            "value2" : 222,
            "value3" : 333
        }
    },
    {
        "name": "bbb",
        "values" : {
            "value1" : 444,
            "value2" : 555,
            "value3" : 666
        }
    }
]

还有我的班级:

public class Elements {
    
    @JsonProperty("name")
    String name;
    @JsonProperty("values")
    Values values;
    
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Values getValues() {
        return this.values;
    }

    public void setValues(Values values) {
        this.values = values;
    }
}
public class Values {
    @JsonProperty("value1")
    int value1;
    @JsonProperty("value2")
    int value2;
    @JsonProperty("value3")
    int value3;

    public int getValue1() {
        return this.value1;
    }

    public void setValue1(int value1) {
        this.value1 = value1;
    }

    public int getValue2() {
        return this.value2;
    }

    public void setValue2(int value2) {
        this.value2 = value2;
    }

    public int getValue3() {
        return this.value3;
    }

    public void setValue3(int value3) {
        this.value3 = value3;
    }
}

【问题讨论】:

  • 当您已经填充了对象时,为什么不在反序列化后进行转换?值总是 3 吗?
  • 试试objectMapper.readValue(json, Map.class)
  • @Franjavi。谢谢,这使事情变得更容易了,但并没有解决外部类的问题。 mapper.readValue(str, Elements.class) 仅在我返回 List Elements[].class. 时有效
  • 对不起@bbx402,我不认为我完全了解您的需求。外部类问题是什么意思?

标签: java json jackson


【解决方案1】:

我赞成 @Michal 的回答,因为它真的很酷,并且可以满足您的要求:

我需要一个 {name, HashMap} 类型的 HashMap

如果您需要 HashMap 的 HashMap 中的数据,我不明白您为您定义了什么 ElementsValues 类。

出于好奇,我用你的课程测试了 Jackson,效果很好:

// Deserialize as a list
List<Elements> listElements = objectMapper.readValue(JSON, new TypeReference<List<Elements>>(){});
// print elements
listElements.forEach(System.out::println);

【讨论】:

    【解决方案2】:

    只需将其读取为Map 实例中的List 并在反序列化过程后将其收集到新的Map

    List<Map<String, Object>> listOfMaps = mapper.readValue(json, new TypeReference<List<Map<String, Object>>>() {});
    Map<String, Object> desiredMap = listOfMaps.stream().collect(HashMap::new,
            (result, map) -> result.put(map.get("name").toString(), map.get("values")),
            (existing, replacement) -> { });
    

    【讨论】:

    • 谢谢,@Michal。作品。看来我需要先获取一个列表,而我无法直接获取 HashMap。
    • @bbx402,有时更容易阅读它在JSON有效负载中定义的形式,然后转换为所需的格式。如果您想直接反序列化为Map&lt;String, Map&gt;,则必须创建自定义反序列化器。
    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多