Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JAVA从动态创建的JSON中递归获取所有键值对_Java_Json - Fatal编程技术网

如何使用JAVA从动态创建的JSON中递归获取所有键值对

如何使用JAVA从动态创建的JSON中递归获取所有键值对,java,json,Java,Json,有没有办法将字段和值转换成Java代码。 例如,我有以下JSON: { "name":"Example", "description":"An example", "process_1": { "name":"My process-1", "image":"Docker Image", "command":["command", "file_name"]

有没有办法将字段和值转换成Java代码。 例如,我有以下JSON:

{
        "name":"Example",
        "description":"An example",
        "process_1": {
                "name":"My process-1",
                "image":"Docker Image",
                "command":["command", "file_name"],
                "arguments":["--arg"]
                },
        "process_2": {
                "name":"My process-2",
                "image":"Docker Image",
                "command":["command", "file_name"],
                "arguments":["--arg"]
                }
        .
        .

        .
        .
        "process_n": {
                "name":"My process-n",
                "image":"Docker Image",
                "command":["command", "file_name"],
                "arguments":["--arg"]
                }
}
现在我想用java将所有键作为变量及其相应的值。 请注意,JSON中的字段名不是常量,即每次动态创建JSON文件时使用不同的字段名。名称和描述字段以及进程内的字段都是常量。但不是过程字段

例如,在Java中,它应该如下所示:

String name = "Example"
String description = "An Example"
String process_1_name = "My process-1"
String process_2_command = ["command", "file_name"]

此外,我不知道如何将级联字段存储为“process-1”。

您的json无效-删除,“
”参数之后“:[“--arg]”,

对于解析,您可以使用
com.fasterxml.jackson.databind.ObjectMapper
和映射:

public static void main(String[] args) throws IOException {
  String json =  "{\n" +
          "  \"name\":\"Example\",\n" +
          "  \"description\":\"An example\",\n" +
          "  \"process-1\": {\n" +
          "    \"name\":\"My process-1\",\n" +
          "    \"image\":\"Docker Image\",\n" +
          "    \"command\":[\"command\", \"file_name\"],\n" +
          "    \"arguments\":[\"--arg\"]\n" +
          "  },\n" +
          "  \"process-2\": {\n" +
          "    \"name\":\"My process-1\",\n" +
          "    \"image\":\"Docker Image\",\n" +
          "    \"command\":[\"command\", \"file_name\"],\n" +
          "    \"arguments\":[\"--arg\"]\n" +
          "  }\n" +
          "}\n";

    ObjectMapper mapper = new ObjectMapper();
    LinkedHashMap valueMap = mapper.readValue(json, LinkedHashMap.class);
    Object name = valueMap.get("name");
    Object description = valueMap.get("description");
    System.out.println("name: " + name);
    System.out.println("description: " + description);

    Map process1 = (Map) valueMap.get("process-1");
    Object process1Name = process1.get("name");
    Object process1Image = process1.get("image");
    System.out.println("process1Name: " + process1Name);
    System.out.println("process1Image: " + process1Image);

    mapper.writeValue(new File("./process-1.json"), process1);
    mapper.writeValue(new File("./process-2.json"), (Map) valueMap.get("process-2"));
}
输出:

name: Example
description: An example
process1Name: My process-1
process1Image: Docker Image

我不知道有哪一个库可以从json创建一个完整的对象,除了Line上的一些生成器,您需要的是一个Hashmap,而不是变量。此外,
process-1
不能是变量。您可以使用Jackson框架将所有详细信息获取到Java对象中。是否还需要嵌套键?您可以使用Jackson中的JsonNode获取process-1和process-2。我刚刚更新了答案。(“添加了process-1”)请看一看。我在问题中提到,字段名不是恒定的,即每次都使用不同的字段名动态创建JSON文件。但在这个解决方案中,我们需要事先知道字段名。名称、描述是常量,但进程字段名不是。您可以将“image”和其他字段移动到config或parameters。但是,如果您只需要将“process-1”和“process-2”存储到一个文件中,您可以使用相同的对象映射器。看看最新的答案。