Java 当根节点只有一个值时,如何使用Jackson读取它们?

Java 当根节点只有一个值时,如何使用Jackson读取它们?,java,json,jackson,Java,Json,Jackson,我读入了一个有效的JSON文件,该文件的格式如下所示(我对此没有控制权),其中只包含根节点的值,使用: import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; JsonNode rootNode = jsonMapper.readTree(belowString); 如何获取我不知道的根节点名称(下面的第一个和第二个) 随后,我还需要读取出席值 公认的答案是#1。 这是我用于#2访问

我读入了一个有效的JSON文件,该文件的格式如下所示(我对此没有控制权),其中只包含根节点的值,使用:

import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
JsonNode rootNode = jsonMapper.readTree(belowString);
  • 如何获取我不知道的根节点名称(下面的第一个和第二个)
  • 随后,我还需要读取出席值
  • 公认的答案是#1。 这是我用于#2访问嵌套节点的分辨率:

    while (iter.hasNext()) {
       Map.Entry<String, JsonNode> entry = iter.next();
    
       System.out.println("key: " + entry.getKey());
       System.out.println("value: " + entry.getValue());
    
       if (entry.getValue().isArray()) {
           JsonNode attending = entry.getValue().get(1).get("attending");
           System.out.println("attending = " + attending.toString());
       }
    }
    
    while(iter.hasNext()){
    Map.Entry=iter.next();
    System.out.println(“key:+entry.getKey());
    System.out.println(“value:+entry.getValue());
    if(entry.getValue().isArray()){
    JsonNode Attenting=entry.getValue().get(1.get(“Attenting”);
    System.out.println(“attenting=“+attenting.toString());
    }
    }
    
    你就快到了!下面是一个简短的片段。希望这会有所帮助

    JsonNode node = mapper.readTree( "{\"First\":[{\"name\":\"Bill\",\"groupName\":\"team1\",\"groupType\":\"golf\",\"info\":[{\"name\":\"George\",\"groupName\":\"Caddy\"}],\"attending\":false},{\"name\":\"Fred\",\"groupName\":\"team2\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Todd\",\"groupName\":\"caddy\"}],\"attending\":false},{\"name\":\"Mike\",\"groupName\":\"team3\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Peter\",\"groupName\":\"caddy\"}],\"attending\":false}],\"Second\":[{\"name\":\"Alan\",\"groupName\":\"team4\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Tony\",\"groupName\":\"caddy\"}],\"attending\":false}]}".getBytes() );
    node.fields().forEachRemaining( entry -> System.out.println( "Key "+ entry.getKey() + " Value "+ entry.getValue()) );
    
    输出:

    Key First Value [{"name":"Bill","groupName":"team1","groupType":"golf","info":[{"name":"George","groupName":"Caddy"}],"attending":false},{"name":"Fred","groupName":"team2","groupType":"golf","info":[{"name":"Todd","groupName":"caddy"}],"attending":false},{"name":"Mike","groupName":"team3","groupType":"golf","info":[{"name":"Peter","groupName":"caddy"}],"attending":false}]
    Key Second Value [{"name":"Alan","groupName":"team4","groupType":"golf","info":[{"name":"Tony","groupName":"caddy"}],"attending":false}]
    

    你快到了!下面是一个简短的片段。希望这会有所帮助

    JsonNode node = mapper.readTree( "{\"First\":[{\"name\":\"Bill\",\"groupName\":\"team1\",\"groupType\":\"golf\",\"info\":[{\"name\":\"George\",\"groupName\":\"Caddy\"}],\"attending\":false},{\"name\":\"Fred\",\"groupName\":\"team2\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Todd\",\"groupName\":\"caddy\"}],\"attending\":false},{\"name\":\"Mike\",\"groupName\":\"team3\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Peter\",\"groupName\":\"caddy\"}],\"attending\":false}],\"Second\":[{\"name\":\"Alan\",\"groupName\":\"team4\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Tony\",\"groupName\":\"caddy\"}],\"attending\":false}]}".getBytes() );
    node.fields().forEachRemaining( entry -> System.out.println( "Key "+ entry.getKey() + " Value "+ entry.getValue()) );
    
    输出:

    Key First Value [{"name":"Bill","groupName":"team1","groupType":"golf","info":[{"name":"George","groupName":"Caddy"}],"attending":false},{"name":"Fred","groupName":"team2","groupType":"golf","info":[{"name":"Todd","groupName":"caddy"}],"attending":false},{"name":"Mike","groupName":"team3","groupType":"golf","info":[{"name":"Peter","groupName":"caddy"}],"attending":false}]
    Key Second Value [{"name":"Alan","groupName":"team4","groupType":"golf","info":[{"name":"Tony","groupName":"caddy"}],"attending":false}]
    

    要获取字段名,请执行以下操作:

    Iterator<String> iter = rootNode.fieldNames();
    while (iter.hasNext()) {
        System.out.println("field: " + iter.next());
    }
    
    Iterator iter=rootNode.fieldNames();
    while(iter.hasNext()){
    System.out.println(“字段:+iter.next());
    }
    
    要获取名称和值,请执行以下操作:

    Iterator<Entry<String, JsonNode>> iter = rootNode.fields();
    while (iter.hasNext()) {
        Entry<String, JsonNode> entry = iter.next();
        System.out.println("key: " + entry.getKey());
        System.out.println("value: " + entry.getValue());
    }
    
    Iterator iter=rootNode.fields();
    while(iter.hasNext()){
    Entry=iter.next();
    System.out.println(“key:+entry.getKey());
    System.out.println(“value:+entry.getValue());
    }
    
    获取字段名:

    Iterator<String> iter = rootNode.fieldNames();
    while (iter.hasNext()) {
        System.out.println("field: " + iter.next());
    }
    
    Iterator iter=rootNode.fieldNames();
    while(iter.hasNext()){
    System.out.println(“字段:+iter.next());
    }
    
    要获取名称和值,请执行以下操作:

    Iterator<Entry<String, JsonNode>> iter = rootNode.fields();
    while (iter.hasNext()) {
        Entry<String, JsonNode> entry = iter.next();
        System.out.println("key: " + entry.getKey());
        System.out.println("value: " + entry.getValue());
    }
    
    Iterator iter=rootNode.fields();
    while(iter.hasNext()){
    Entry=iter.next();
    System.out.println(“key:+entry.getKey());
    System.out.println(“value:+entry.getValue());
    }
    
    如果
    readTree(…)
    不是一项要求,您还可以使用
    readValue(…)
    将此Json反序列化为
    映射,例如:

    @Test
    public void test() throws Exception {
        ObjectMapper jsonMapper = new ObjectMapper();
        // JSON contains this kind of a structure
        Map<String, List<Map<String, Object>>> map = jsonMapper
                    // test.json should be in the same package as test and contain 
                    // your Json
                    .readValue(getClass().getResourceAsStream("test.json"), Map.class);
        // Result of this loggion below
        map.entrySet().forEach(entry -> {
            log.info("key: {}", entry.getKey());
            entry.getValue().forEach(person -> {
                log.info(" {} attending: {}", person.get("name"), person.get("attending"));
            });
        });
    }
    
    @测试
    public void test()引发异常{
    ObjectMapper jsonMapper=新的ObjectMapper();
    //JSON包含这种结构
    Map=jsonMapper
    //test.json应该与test和contain位于同一个包中
    //你的Json
    .readValue(getClass().getResourceAsStream(“test.json”)、Map.class);
    //下面是这个日志的结果
    map.entrySet().forEach(条目->{
    log.info(“key:{}”,entry.getKey());
    entry.getValue().forEach(person->{
    log.info(“{}出席:{}”、person.get(“姓名”)、person.get(“出席”);
    });
    });
    }
    
    日志应类似于:

    键:第一个
    账单出席:假
    弗雷德:错
    迈克:错
    键:第二个
    艾伦:错


    如果
    readTree(…)
    不是必需的,则还可以将此Json反序列化为
    Map
    readValue(…)
    ,如:

    @Test
    public void test() throws Exception {
        ObjectMapper jsonMapper = new ObjectMapper();
        // JSON contains this kind of a structure
        Map<String, List<Map<String, Object>>> map = jsonMapper
                    // test.json should be in the same package as test and contain 
                    // your Json
                    .readValue(getClass().getResourceAsStream("test.json"), Map.class);
        // Result of this loggion below
        map.entrySet().forEach(entry -> {
            log.info("key: {}", entry.getKey());
            entry.getValue().forEach(person -> {
                log.info(" {} attending: {}", person.get("name"), person.get("attending"));
            });
        });
    }
    
    @测试
    public void test()引发异常{
    ObjectMapper jsonMapper=新的ObjectMapper();
    //JSON包含这种结构
    Map=jsonMapper
    //test.json应该与test和contain位于同一个包中
    //你的Json
    .readValue(getClass().getResourceAsStream(“test.json”)、Map.class);
    //下面是这个日志的结果
    map.entrySet().forEach(条目->{
    log.info(“key:{}”,entry.getKey());
    entry.getValue().forEach(person->{
    log.info(“{}出席:{}”、person.get(“姓名”)、person.get(“出席”);
    });
    });
    }
    
    日志应类似于:

    键:第一个
    账单出席:假
    弗雷德:错
    迈克:错
    键:第二个
    艾伦:错


    谢谢字段名和字段将无法为我解析。。。。org.codehaus.jacksonJsonNode没有fields\fieldnames属性…您使用的是什么?我使用的是com.fasterxml.jackson.databind.JsonNode,假设您使用的是相同的属性。检查。Yikes,很棒的地方,我们的代码库中有两个版本。使用Java8更容易,但是如何在Java7中访问Attenting属性呢?我尝试在while循环中的entry.getValue().fields()上嵌套第二个迭代器…谢谢。字段名和字段将无法为我解析。。。。org.codehaus.jacksonJsonNode没有fields\fieldnames属性…您使用的是什么?我使用的是com.fasterxml.jackson.databind.JsonNode,假设您使用的是相同的属性。检查。Yikes,很棒的地方,我们的代码库中有两个版本。使用Java8更容易,但是如何在Java7中访问Attenting属性呢?我尝试在while循环中的entry.getValue().fields()上嵌套第二个迭代器…谢谢。我们仍然停留在Java 7上。@boardtc Ok,但不要使用lambda访问映射:)这只是一个演示如何访问映射值的示例,我会在合适的时候将其更新为(…)
    版本。readVlue不需要Java8,谢谢。我们仍然停留在Java 7上。@boardtc Ok,但不要使用lambda访问映射:)这只是一个演示如何访问映射值的示例,我会在合适的时候将其更新为(…)版本。readVlue不需要Java 8,请检查org.codehaus.jackson的相关信息。检查org.codehaus.jackson的相关信息。