Как прочитать корневые узлы, когда они имеют значение только с использованием Джексона? - PullRequest
0 голосов
/ 15 января 2019

Я прочитал в допустимом файле JSON, который имеет формат, показанный ниже (у меня нет никакого контроля в этом) с только значениями для корневых узлов, используя:

import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
JsonNode rootNode = jsonMapper.readTree(belowString);
  1. Как получить имена корневых узлов (первый и второй ниже), которых я не знаю?
  2. Впоследствии мне также нужно прочитать значение для посещения
{
"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
}]
}

Принятый ответ решен # 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());
   }
}

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Чтобы получить имена полей:

Iterator<String> iter = rootNode.fieldNames();
while (iter.hasNext()) {
    System.out.println("field: " + 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());
}
0 голосов
/ 16 января 2019

Вы также можете десериализовать этот Json как Map с readValue(..), если readTree(..) не является обязательным требованием, например:

@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"));
        });
    });
}

Журнал должен быть как:

ключ: первый
Счет за участие: ложь
Фред присутствовал: ложь
Майк посещает: ложь
ключ: второй
Алан присутствовал: ложь

0 голосов
/ 15 января 2019

Вы почти у цели! Найдите ниже быстрый фрагмент. Надеюсь, это поможет.

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}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...