java - 从二维矩阵中提取 JSON 键

标签 java json json-simple

处理表示二维矩阵的有效 JSON 时:

[ { "a":1, "b":2 }, { "b":3, "c":4 }, { "c":6, "a":5 } ]

使用 Java 1.8 和 json-simple 库:

<dependency>
  <groupId>com.googlecode.json-simple</groupId>
  <artifactId>json-simple</artifactId>
  <version>1.1.1</version>
</dependency>

能够使用以下方法获取单独的行吗?:

JSONParser parser = new JSONParser();
Object obj = parser.parse(args[0]);
JSONArray array = (JSONArray) obj;
System.out.println(array.get(0));

输出:

{"a":1,"b":2}

我的问题是如何从这个二维矩阵中提取键值来输出:

'{ "a": [1,null,5], "b": [2,3,null], "c": [null,4,6] }'

请注意,行中缺少的任何变量都应插入 null...

最佳答案

一般解决方案如下所示:

  1. JSON 负载读取为 ARRAY
  2. ARRAY 中的所有 JSON 对象 中查找所有可能的键,并将它们存储在 KEYS 集中。
  3. 迭代ARRAY中的所有JSON对象
  4. 迭代所有KEY并从给定的JSON对象获取值或null

使用Java 8功能我们可以实现如下:

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

public class JsonSimpleApp {
    public static void main(String[] args) throws ParseException {
        // input
        String json = "[ { \"a\":1, \"b\":2 }, { \"b\":3, \"c\":4 }, { \"c\":6, \"a\":5 } ]";

        // read as JSONArray
        JSONParser parser = new JSONParser();
        JSONArray array = (JSONArray) parser.parse(json);

        // Find all possible keys
        Set<String> keys = (Set<String>) array.stream().flatMap(i -> ((JSONObject) i).keySet().stream()).collect(Collectors.toSet());

        // create result Map with KEY - LIST pair
        Map<String, List<Object>> result = new HashMap<>();
        keys.forEach(key -> result.put(key, new ArrayList<>()));

        // Iterate over all JSONObject's
        array.forEach(item -> {
            JSONObject object = (JSONObject) item;
            // For each possible key add a value or NULL to each list
            keys.forEach(key -> result.get(key).add(object.remove(key)));
        });

        result.entrySet().forEach(System.out::println);
    }
}

上面的代码打印:

a=[1, null, 5]
b=[2, 3, null]
c=[null, 4, 6]

关于java - 从二维矩阵中提取 JSON 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59847647/

相关文章:

Java从JSON文件中解析JSON数组

java - 将 JSON 字符串转换为 Java 对象以便在 JSP 中使用

Java JSON包导入失败

java - 如何在 Java 的 JSON 字符串中找到指定的名称及其值?

java - 如何通过传递对象作为参数来实例化 CDI bean,就像我从参数化构造函数在纯 Java 中实例化新对象一样?

java - 使用自定义验证根据 XSD 验证 XML

java - 您不需要 Canvas 或 JPanel 来绘图吗?

java - 如何 sleep ()或等待()通过实现可运行接口(interface)创建的线程?

sql-server - 如何强制 SQL Server 返回空 JSON 数组

python - 在 for 循环中自动更改索引