使用JSON库将JSON解析为Java Object

问题描述 投票:0回答:1

我正在使用IntelliJ Idea和Play Framework with Java。我向服务器发送请求并以JSON格式获得响应。但响应是巨大的,我实际上只需要一行。所有其他人都可以被忽略。如何在我的程序中进一步使用这一行作为JavaObject,如何忽略其他行?

为了忽略其他行,我尝试了这样的事情:

.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,true);

但它给了我一个错误说:

找不到符号符号:DeserializationFeature

据我所知,我可以在Play Framework中使用Jackson库。我不确定我是否正确使用它。

这是我的代码:

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,因为我不确定我是否正确使用了库:

// 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"
java json intellij-idea jackson playframework-2.0
1个回答
0
投票

首先,您应该只使用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'
© www.soinside.com 2019 - 2024. All rights reserved.