Получить вложенный Json, когда некоторые ключи случайны - PullRequest
0 голосов
/ 03 августа 2020

Итак, в Java у меня это json Строка:

public static void main(String[] args) {
    String stringJson = "{\n" +
            "nodes: {\n" +
            "Random-key-Here: {\n" +
            "name: \"PRO-cnt-elastic2-4-i-0a414518a5b67\",\n" +
            "transport_address: \"172.18.7.104:9300\",\n" +
            "host: \"189.88.7.884\",\n" +
            "ip: \"188.88.8.884:8880\",\n" +
            "roles: [\n" +
            "\"ingest\"\n" +
            "],\n" +
            "attributes: {\n" +
            "zone: \"us-east-1a\"\n" +
            "},\n" +
            "tasks: {\n" +
            "Random-key-Here: {\n" +
            "node: \"-2688888mRPYHywWA\",\n" +
            "id: 37202060,\n" +
            "type: \"transport\",\n" +
            "action: \"indices:data/write/reindex\",\n" +
            "status: {\n" +
            "total: 4869544,\n" +
            "updated: 13920,\n" +
            "created: 3654080,\n" +
            "deleted: 0\n" +
            "},\n" +
            "description: \"blaaa\",\n" +
            "start_time_in_millis: 1596456902705,\n" +
            "running_time_in_nanos: 647855785005,\n" +
            "cancellable: true,\n" +
            "headers: { }\n" +
            "}\n" +
            "}\n" +
            "}\n" +
            "}\n" +
            "}";

    JsonObject jo = new JsonParser().parse(stringJson).getAsJsonObject();
    Set s = jo.get("nodes").getAsJsonObject().entrySet().stream().map(e ->
            e.getValue().getAsJsonObject().get("tasks").collect(toSet());
}

Важно : заметка внутри Json, некоторые ключи на самом деле являются случайными строка, которую я не мог знать заранее ... - поэтому я написал их как "Random-key-Here"

Короче: Моя цель - получить номер этого поля, "всего : 4869544 ".

Выше вот что пробовал. Мне удалось получить список, содержащий один объект-член набора, и это «Случайный ключ-здесь» в качестве ключа, а значение - это остальная часть моих вложенных json.

Я подумал, что если бы я повторил тот же лог c, что и сделал, чтобы преодолеть первую вещь «Случайный ключ-здесь», как я сделал с

.entrySet().stream().map(e -> 
        e.getValue().getAsJsonObject().get("tasks")

, тогда я бы перешел на другой уровень ниже, поэтому вместо «задачи» я написал «статус», и я подумал, что смогу получить остальную часть вложенного json, что с этого момента будет проще ... но вместо этого при этом ничего не возвращается:

jo.get("nodes").getAsJsonObject().entrySet()
            .stream()
            .map(e -> e.getValue().getAsJsonObject().get("tasks").getAsJsonObject().entrySet()
                    .stream()
                    .map(ent-> ent.getValue().getAsJsonObject().get("status").getAsJsonObject().get("total").getAsJsonObject()))

был бы признателен за любую помощь, чтобы добраться до нужной вложенной части: «total: 4869544». и имейте в виду, я не могу просто использовать это:

jo.get("nodes").getAsJsonObject().get("Random-key-Here").getAsJsonObject().get("tasks")
        .getAsJsonObject().get("Random-key-Here").getAsJsonObject()
        .get("status").getAsJsonObject().get("total").getAsInt()

из-за "Random-key-Here".

Tnx for the helpers!

1 Ответ

0 голосов
/ 04 августа 2020

Ответ себе: Итак, на каждом неизвестном ключе, который у вас есть, вы можете использовать entrySet(), а затем l oop, пока не дойдете до желаемого элемента поля. поэтому это использование решает проблему и может получить вложенный Json, даже если ваш ключ заранее неизвестен:

 jo.get("nodes").getAsJsonObject().entrySet()
     .forEach(node -> node.getValue().getAsJsonObject().get("tasks").getAsJsonObject().entrySet()
          .forEach(task -> { int i = task.getValue().getAsJsonObject().get("status").getAsJsonObject().get("total").getAsInt(); 
                System.out.println(i); }))

, пожалуйста, поделитесь, если у кого-то есть более эффективный способ сделать это

...