【问题标题】:How to map JSON to Java HashMap如何将 JSON 映射到 Java HashMap
【发布时间】:2021-11-05 01:48:37
【问题描述】:

我有一个这样的 JSON:[{key:key1, value:value1}, {key:key2, value:value2}, ..., {key:keyn, value:valuen}]

我需要一个来自该 json 的 Java HashMap,例如:{key1:value1, key2:value2, ..., keyn:valuen}

有没有简单的方法让它像这样转换?我正在尝试使用 Jackson,但不知道如何指定 key 和 value 关键字。

【问题讨论】:

标签: java json dictionary jackson-databind


【解决方案1】:

很简单: https://stackoverflow.com/a/24012023/7137584

我会推荐使用 Jackson 库:

import com.fasterxml.jackson.databind.ObjectMapper;

TypeReference<HashMap<String, Object>> typeRef = new TypeReference<>() {};
Map<String, Object> mapping = new ObjectMapper().readValue(jsonStr, typeRef);

【讨论】:

  • 对于给定的输入,此代码失败,但出现以下异常:Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.HashMap&lt;java.lang.Object,java.lang.Object&gt;` out of START_ARRAY token
【解决方案2】:

输入 JSON 描述了一个映射条目的数组/列表,其中每个条目都是一个 POJO:

@Data
class Entry {
    private String key;
    private String value; // the type of value may be Object
}

这里的@Data是一个Lombok注解,提供getter、setter、toString等。

因此,首先读取地图条目列表,然后将其转换为地图:

String json = "[{\"key\":\"key1\", \"value\":\"value1\"}, {\"key\":\"key2\", \"value\":\"value2\"}, {\"key\":\"keyN\", \"value\":\"valueN\"}]";

// step 1: read raw list of entries
List<Entry> input = mapper.readValue(json, new TypeReference<List<Entry>>() {});

// step 2: convert to map
Map<String, String> mapRead = input.stream()
       .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

System.out.println(mapRead);

输出:

{key1=value1, key2=value2, keyN=valueN}

【讨论】:

    【解决方案3】:

    这是使用JSON-P api 的解决方案。

    import javax.json.*;
    
    var str = "[{\"key\":\"key1\", \"value\":\"value1\"}, {\"key\":\"key2\", \"value\":\"value2\"}, {\"key\":\"keyN\", \"value\":\"valueN\"}]";
    JsonReader reader = Json.createReader(new StringReader(str));
    JsonArray jarr = reader.readArray();
    Map<String,String> map = new HashMap<>();
    for(JsonValue jv : jarr) {
        JsonObject jo = (JsonObject)jv;
        map.put(jo.getString("key"), jo.getString("value") );
    }
    System.out.println(map);
    

    我正在使用JsonReaderString 转换为JsonArray 对象。 此JsonArray 的每个条目都是JsonObject,例如{key: keyX, value: valueX}。 我得到与“键”和“值”对应的值,并使用 for 循环将它们添加到 HashMap

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 2020-02-23
      • 2014-06-14
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多