Использование библиотек JSON для анализа JSON в JavaObject - PullRequest
0 голосов
/ 08 марта 2019

Я использую IntelliJ Idea и Play Framework с Java.Я отправляю запрос на сервер и получаю ответ в формате JSON.Но ответ огромен, и мне на самом деле нужна только одна строка.Все остальные можно игнорировать.Как я могу использовать эту строку далее в моей программе как JavaObject, и как я могу игнорировать другие строки?

Для игнорирования других строк я попробовал что-то вроде этого:

.configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);

но выдает ошибку:

не может найти символ символа: DeserializationFeature

Как я знаю, я могу использовать библиотеку Джексонав Play Framework.Я не уверен, правильно ли я его использовал.

Вот мой код:

import play.libs.Json;
import org.codehaus.jackson.map.ObjectMapper;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.core;
...
StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);

        return ok(response.toString());
    }

Вот ответ в формате JSON: https://pastebin.com/kh7pGiN5.

И вотbuild.sbt из Framework, так как я не уверен, что правильно использовал библиотеки:

// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-core" % "2.9.8"

// https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl
libraryDependencies += "org.codehaus.jackson" % "jackson-mapper-asl" % "1.9.13"

// https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-core-asl
libraryDependencies += "org.codehaus.jackson" % "jackson-core-asl" % "1.9.13"

// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-annotations" % "2.9.8"

// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.9.8"

1 Ответ

0 голосов
/ 09 марта 2019

Прежде всего вы должны использовать только FasterXML зависимости. Удалить все codehaus зависимости. Когда вы читаете JSON и вам нужен только один или несколько элементов, вы можете прочитать JSON как JsonNode и пройти его как дерево. Для ускорения обхода вы можете использовать paths: /response/GeoObjectCollection/featureMember для поиска массива featureMember и /GeoObject/metaDataProperty/GeocoderMetaData/Address/Components для поиска массива Components в каждом элементе featureMember. Смотрите приложение ниже, чтобы узнать все детали:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        JsonNode root = mapper.readTree(jsonFile);
        GeoObjectWalker walker = new GeoObjectWalker(root);

        List<String> countries = Arrays.asList("Germany", "United States of America", "Austria", "Belgium");
        countries.forEach(country -> {
            final String message = "'%s' has first province: '%s'";
            System.out.println(String.format(message, country, walker.findProvinceForCountry(country).orElse("'not found'")));
        });
    }
}

class GeoObjectWalker {

    private final JsonNode root;

    public GeoObjectWalker(JsonNode root) {
        this.root = root;
    }

    public Optional<String> findProvinceForCountry(String country) {
        // find featureMember array
        JsonNode featureMembers = root.at("/response/GeoObjectCollection/featureMember");
        if (featureMembers.isMissingNode()) {
            return Optional.empty();
        }

        for (int i = 0; i < featureMembers.size(); i++) {
            JsonNode featureMember = featureMembers.get(i);
            // find Components array
            JsonNode components = featureMember.at("/GeoObject/metaDataProperty/GeocoderMetaData/Address/Components");
            if (components.isMissingNode()) {
                continue;
            }

            if (componentsArrayContains(components, "country", country)) {
                Optional<String> province = findNameForKind(components, "province");
                if (province.isPresent()) {
                    return province;
                }
            }
        }

        return Optional.empty();
    }

    private boolean componentsArrayContains(JsonNode array, String kind, String name) {
        for (int i = 0; i < array.size(); i++) {
            JsonNode node = array.get(i);
            if (node.get("kind").asText().equals(kind) && node.get("name").asText().equals(name)) {
                return true;
            }
        }

        return false;
    }

    private Optional<String> findNameForKind(JsonNode array, String kind) {
        for (int i = 0; i < array.size(); i++) {
            JsonNode node = array.get(i);
            if (node.get("kind").asText().equals(kind)) {
                return Optional.of(node.get("name").asText());
            }
        }

        return Optional.empty();
    }
}

Над отпечатками кодов:

'Germany' has first province: 'Bayern'
'United States of America' has first province: 'South Carolina'
'Austria' has first province: 'Oberösterreich'
'Belgium' has first province: 'Vlaams Brabant'
...