[英]Using JSON libraries for parsing JSON to JavaObject
我正在将IntelliJ Idea and Play Framework与Java一起使用。 我向服务器发送请求并获得JSON格式的响应。 但是响应是巨大的,我实际上只需要一行。 所有其他的都可以忽略。 如何在程序中将此行作为JavaObject
进一步使用,如何忽略其他行?
为了忽略其他行,我尝试了如下操作:
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,true);
但这给了我一个错误:
找不到符号符号:反序列化功能
据我所知,我可以在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 。
这是来自Framework的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
来查找featureMember
每个元素中的Components
数组。 请参阅以下应用程序以查找所有详细信息:
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'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.