我正在使用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"
首先,您应该只使用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'