Извлечь некоторое значение без ключа из объекта json - PullRequest
0 голосов
/ 01 июня 2018

Я использую java для извлечения списка идентификаторов узлов из ответа запуска задач эластичного поиска.

Ответ выглядит следующим образом

{
    "nodes": {
        "ZKUuxQZpRCCcJ0njBM1P0A": {
            "name": "ZKUuxQZ",
            "transport_address": "127.0.0.1:9300",
            "host": "127.0.0.1",
            "ip": "127.0.0.1:9300",
            "roles": [
                "master",
                "data",
                "ingest"
            ],
            "tasks": {
                "ZKUuxQZpRCCcJ0njBM1P0A:118": {
                    "node": "ZKUuxQZpRCCcJ0njBM1P0A",
                    "id": 118,
                    "type": "transport",
                    "action": "indices:data/write/delete/byquery",
                    "start_time_in_millis": 1527808643421,
                    "running_time_in_nanos": 154234724059,
                    "cancellable": true,
                    "headers": {}
                }
            }
        }
    }
}

В этомНапример, я хочу, чтобы точный ZKUuxQZpRCCcJ0njBM1P0A:118.Может кто-нибудь дать мне пример, как извлечь эту информацию?

Вариант 1, java json parser.Я хотел написать класс ответа и разобрать строку json, но ZKUuxQZpRCCcJ0njBM1P0A:118 не в формате ключ: значение.Я не уверен, как извлечь его.

Вариант 2, используя регулярное выражение.Часть идентификатора узла также может иметь - или _.Может ли кто-нибудь предоставить аккуратное Java регулярное выражение?Пока что мое регулярное выражение [a-zA-Z0-9\-\_]+\:[0-9]+, я не уверен, достаточно ли это безопасно.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Так что регулярное выражение слишком хакерское, и я понял это с помощью gson.Я бы хотел, чтобы ElasticSearch мог предложить нам некоторую стандартную библиотеку для извлечения всевозможных ответов.Вот мое решение с использованием gson.

import com.google.gson.*;

import org.json.JSONObject;

проверка открытого класса {

public static void main(String[] args) throws Exception {
    String jsonString = "json_format elasticsearch reponse for listing running tasks"
    JsonParser parser = new JsonParser();
    JsonObject jsonObject = parser.parse(content).getAsJsonObject();

    jsonObject.getAsJsonObject("nodes").entrySet().forEach(
            s -> {
                s.getValue().getAsJsonObject().getAsJsonObject("tasks").entrySet().forEach( s2 -> {
                    System.out.println(s2.getKey());
                });
            });
}

. Она печатает все идентификаторы выполняющихся задач, напримерследующие.Технически это nodeId: taskId, но ES имеет очень расплывчатое описание в своих документах API задач (он говорит, что вы можете использовать TASK_ID для проверки состояния задачи, хорошо, что TASK_ID - это nodeId: taskId).

Mw-3i39gTHGxu5c8z9viQQ:503209021 DZ29LMsWR0aW9guWZTYe2Q:482931604 6CAbDZSWR8SfwZgnRT0qNg:494351185

0 голосов
/ 02 июня 2018

Используйте следующее регулярное выражение:

[a-zA-Z0-9-_]*[0-9]+[a-zA-Z]+:[0-9]*

Вы можете найти результат теста здесь:

https://regexr.com/3qdug

0 голосов
/ 01 июня 2018

Один из способов сделать это - использовать библиотеку org.json и создать JSONObject, а с помощью keys() вы можете получить все ключи и использовать это для выполнения своей задачи

Добавьте следующую зависимость вваш pom.xml

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20180130</version>
</dependency>

Затем вы можете сделать что-то вроде ниже:

String jsonString = "{\n" +
        "    \"nodes\": {\n" +
        "        \"ZKUuxQZpRCCcJ0njBM1P0A\": {\n" +
        "            \"name\": \"ZKUuxQZ\",\n" +
        "            \"transport_address\": \"127.0.0.1:9300\",\n" +
        "            \"host\": \"127.0.0.1\",\n" +
        "            \"ip\": \"127.0.0.1:9300\",\n" +
        "            \"roles\": [\n" +
        "                \"master\",\n" +
        "                \"data\",\n" +
        "                \"ingest\"\n" +
        "            ],\n" +
        "            \"tasks\": {\n" +
        "                \"ZKUuxQZpRCCcJ0njBM1P0A:118\": {\n" +
        "                    \"node\": \"ZKUuxQZpRCCcJ0njBM1P0A\",\n" +
        "                    \"id\": 118,\n" +
        "                    \"type\": \"transport\",\n" +
        "                    \"action\": \"indices:data/write/delete/byquery\",\n" +
        "                    \"start_time_in_millis\": 1527808643421,\n" +
        "                    \"running_time_in_nanos\": 154234724059,\n" +
        "                    \"cancellable\": true,\n" +
        "                    \"headers\": {}\n" +
        "                }\n" +
        "            }\n" +
        "        }\n" +
        "    }\n" +
        "}";

JSONObject jsonObject = new JSONObject(jsonString);

Set<String> topLevelKeys = jsonObject.keySet();

for (String key : topLevelKeys) {
    Object value = jsonObject.get(key);

    if (value instanceof JSONObject) {
        JSONObject valueObject = jsonObject.getJSONObject(key);
        System.out.println(valueObject.toString());
    }
}

Расширьте это согласно вашему требованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...