Java Jackson-在数组中获取一个条目

Java Jackson-在数组中获取一个条目,java,json,jackson,Java,Json,Jackson,我有以下JSON源代码: { "my-systems": [{ "SYSTEM_A": [{ "parameter-name": "a_param1", "parameter-display-name": "parameter 1", "optional": "true" }, {

我有以下JSON源代码:

{
    "my-systems": [{
            "SYSTEM_A": [{
                    "parameter-name": "a_param1",
                    "parameter-display-name": "parameter 1",
                    "optional": "true"
                },
                {
                    "parameter-name": "a_param2",
                    "parameter-display-name": "Parameter 2",
                    "optional": "false"
                }
            ]
        },
        {
            "SYSTEM_B": [{
                    "parameter-name": "b_param1",
                    "parameter-display-name": "Parameter 1",
                    "optional": "true"
                },
                {
                    "parameter-name": "b_param2",
                    "parameter-display-name": "Parameter 2",
                    "optional": "false"
                }
            ]
        }
    ]
}

我试着把它读入
map

我有这个代码,我真的不确定它是否是实现我目标的最佳方法

ArrayNode systemsArr = (ArrayNode)jsonDoc.get("my-systems");
if(systemsArr!= null && !systemsArr.isEmpty()){
    for(JsonNode systemNode : systemsArr ){
        ObjectNode systemObj = (ObjectNode)systemNode;

        System.out.println(systemObj .textValue());
    }
}

这是一种有效的方法吗?如何获取系统名称(system_A、system_B)并将包含的参数转换为parameters objects数组

如果您所做的只是保持密钥的唯一性,那么使用数组“我的系统”几乎没有什么用处。(我假设您的系统可能不同)。 相反,我建议您按照以下方式格式化JSON数据:

{
  "my-systems": [
    {
      "system-name" : {
        "name":"System_A",
        "parameters": [
          {
            "parameter-name": "a_param1",
            "parameter-display-name": "parameter 1",
            "optional": "true"
          },
          {
            "parameter-name": "a_param2",
            "parameter-display-name": "Parameter 2",
            "optional": "false"
          }
        ]
      }
   }
  ]
}
此方法是干净的,允许您在属性“system name”下捕获系统的名称,并且其参数嵌套在其中。你可以简单地声明一个模型,Jackson(或gson)将简单地处理所有事情

如果您希望单独解析响应,或者对响应没有控制权,则可以选择使用实现,但不需要转换为ObjectNode。您可以在for循环中使用以下示例:

String f2Str = jsonNode.get("f2").asText();
double f2Dbl = jsonNode.get("f2").asDouble();
int    f2Int = jsonNode.get("f2").asInt();
long   f2Lng = jsonNode.get("f2").asLong();
其中'f2'是您的键,您可以使用node.fieldNames().next()获取键,它实际上是从迭代器获取属性

你也可以尝试下面的方法,它们似乎更容易处理

JsonNode parent = ...;
for (Iterator<String> it = parent.fieldNames() ; it.hasNext() ; ) {
    String field = it.next();
    System.out.println(field + " => " + parent.get(field));
}
for (Iterator<Map.Entry<String,JsonNode>> it = parent.fields() ;
     it.hasNext() ; ) {
    Map.Entry<String,JsonNode> e = it.next();
    System.out.println(e.getKey() + " => " + e.getValue());
}
JsonNode父节点=。。。;
for(迭代器it=parent.fieldNames();it.hasNext();){
字符串字段=it.next();
System.out.println(field+“=>”+parent.get(field));
}
for(迭代器it=parent.fields();
it.hasNext();){
Map.Entry e=it.next();
System.out.println(e.getKey()+“=>”+e.getValue());
}

最新的例子摘自。希望这能有所帮助。

您只需要在依赖项中使用jackson数据绑定和jackson注释jar,就可以运行下面的代码了

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JsonParsing {

    public static void main(String[] args) throws IOException {
        String jsonFilePath = "src/main/resources/source.json"; // JSON File Path
        MySystems mySystems = new ObjectMapper().readValue(new File(jsonFilePath),MySystems.class);

        Map<String,SystemParameter[]> outputMap = new HashMap<>();
        for (Map<String,List<SystemParameter>> map :mySystems.mySystems) {
            for (String key :map.keySet()) {
                outputMap.put(key, map.get(key).toArray(new SystemParameter[0]));
            }
        }
        System.out.println(outputMap);

    }
}

class MySystems {
    @JsonProperty("my-systems")
    List<Map<String,List<SystemParameter>>> mySystems;
}

class SystemParameter {
    @JsonProperty("parameter-name")
    String paramName;

    @JsonProperty("parameter-display-name")
    String paramDispName;

    @JsonProperty("optional")
    String optional;
}
import com.fasterxml.jackson.annotation.JsonProperty;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入java.io.File;
导入java.io.IOException;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
公共类JsonParsing{
公共静态void main(字符串[]args)引发IOException{
String jsonFilePath=“src/main/resources/source.json”;//json文件路径
MySystems MySystems=newObjectMapper().readValue(新文件(jsonFilePath),MySystems.class);
Map outputMap=newhashmap();
for(映射:mySystems.mySystems){
for(字符串键:map.keySet()){
outputMap.put(key,map.get(key).toArray(新系统参数[0]);
}
}
System.out.println(outputMap);
}
}
类MySystems{
@JsonProperty(“我的系统”)
列出我的系统;
}
类系统参数{
@JsonProperty(“参数名”)
字符串参数名;
@JsonProperty(“参数显示名称”)
字符串名称;
@JsonProperty(“可选”)
字符串可选;
}

旁注:您能再次检查问题中的JSON吗?它给了我们很多。(我猜它是从一个更大的JSON源中取样的。)@andrewjames完全正确。完成。@Yaron你能接受下面的答案之一,或者解释为什么这些答案不起作用吗?