繁体   English   中英

将 Json 输入列表转换为 Map 的 Map

[英]Convert List of Json input to Map of Map

我有以下格式的字符串输入:

输入字符串: [{ "id":"1", "name":"A", "address":"St 1"},{ "id":"2", "name":"B", "address":"St 2"}, ...]

我希望能够将其转换为Map<String, Map<String, String>>格式。 所以,像:

必填 Output 格式: {1: {id:1, name:"A", address: "St 1"} 2: {id:2, name:"B", address: "St 2"}}

我创建了一个 class 来帮助解析输入:

public class Student{
  private String id;
  private String name;
  private String address;
}

我试图通过杰克逊的 ObjectMapper 来获取以下格式的数据:列表格式,然后使用 Collectors.toMap() 将其转换为 Map 格式的 Map 格式。

到目前为止,我看到的所有示例都建议采用如下方法:

List<Student> student = objectMapper.readValue(inputString, new TypeReference<List<Student>>(){});
Map <String, Student> studentTempMap = student.stream().collect().(Collectors.toMap(Student::getId, Function.identity()));

这使得 studentTempMap 类似于: {1: object of Student("id":"1", "name":"A", "address":"St 1"), 2: object of Student("id": “2”,“名称”:“B”,“地址”:“St 2”),...}

从这里开始的蛮力方法:

  1. 新建 Map studentMap
  2. 迭代 studentTempMap 中的键(即“id”)。
    • 然后创建另一个 Map,温度。
    • 使用诸如 studentTempMap.get(2).get("id") 之类的东西添加键“id”、“name”和“address”和值,并为所有其他键(名称和地址)添加类似的东西。 其中 2 是 Map studentTempMap 上的当前迭代器键。
    • 最后在 studentMap 中添加一个键,比如 2(当前迭代器)和值 temp。

我不想使用这种蛮力方法,因为我有大量的学生对象。

有没有办法通过 ObjectMapper 直接以Map<String, Map<String, String>>格式获取 output? 或者有没有办法通过 Collectors.toMap 将其解析为上述格式?

我希望能够将其转换为Map<String, Map<String, String>>

如果你想得到一个嵌套的 map 字符串Map<String,Map<String,String>>作为结果,你不需要将 JSON 转换为 POJO 列表。

相反,您可以将 JSON 解析为地图List<Map<String,String>> ,然后生成嵌套的 map

String inputString = """
    [{ "id":"1", "name":"A", "address":"St 1"},
     { "id":"2", "name":"B", "address":"St 2"}]""";
    
ObjectMapper objectMapper = new ObjectMapper();
List<Map<String, String>> students = objectMapper.readValue(
    inputString, new TypeReference<>() {}
);
        
Map<String, Map<String, String>> studentMapById = students.stream()
    .collect(Collectors.toMap(
        map -> map.get("id"), // key 
        Function.identity(),  // value
        (left, right) -> left // resolving duplicates
    ));
    
studentMapById.forEach((k, v) -> System.out.println(k + " : " + v));

Output:

1 : {id=1, name=A, address=St 1}
2 : {id=2, name=B, address=St 2}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM