我正在使用谷歌地理编码API进行逆地理编码。
结果在Json中返回,我正在以下列方式解析 -
Map<String, Object> parsedJson = new ObjectMapper().readValue(
response.getEntity(String.class),
new TypeReference<Map<String, Object>>() {
});
List<Object> results = (List<Object>) parsedJson.get("results");
// From first result get geometry details
Map<String, Object> geometry = (Map<String, Object>) ((Map<String, Object>) results
.get(0)).get("geometry");
Map<String, Object> location = (Map<String, Object>) geometry
.get("location");
Map<String, Double> coordinates = new HashMap<String, Double>();
coordinates.put("latitude", (Double) location.get("lat"));
coordinates.put("longitude", (Double) location.get("lng"));
其中response包含从服务器返回的Json。
是否可以直接引用位置节点而无需经历所有这些?例如。有什么像 -
new ObjectMapper().readValue(json).findNodeByName("lat").getFloatValue();
我已经阅读过Jackson Api中关于JsonNode和Tree的文档,但它们似乎只有在想要遍历整个树时才有用。
仅获取特定节点的最简单方法是什么?
答案 0 :(得分:3)
+1迈克尔希克森指出地理编码库。
但是,在深入研究文档后,我终于找到了解决方案 -
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(mapper.getJsonFactory()
.createJsonParser(response.getEntity(String.class)));
rootNode.findValue("lat").getDoubleValue();
答案 1 :(得分:1)
我对“如何按名称查找节点”问题没有答案,但如果您只是想找一种更清晰的方式来阅读这些数据,那么我建议采用以下方法之一:顺序:
答:为Google的地理编码API寻找预先存在的Java库。如果你现在用Java(使用Apache HttpClient或其他东西)对这些数据发出HTTP请求,然后用Jackson解析JSON,有人可能以前完成了所有工作并将其打包到库中。快速搜索提出了这个问题:http://code.google.com/p/geocoder-java/。你可以得到第一个纬度值:
GeocodeResponse response = ... // Look at the example code on that site.
BigDecimal latitude = response.getResults().get(0).getGeometry().getLocation().getLat()
B:创建自己的类层次结构来表示您需要的东西,然后给杰克逊提供JSON和根“响应”类。我很确定它可以从JSON构建任意类的实例。所以像这样:
public class ResultSet {
public List<Result> results;
}
public class Result {
public Geometry geometry;
}
public class Geometry {
public Location location;
}
public class Location {
public double latitude;
public double longitude;
}
String json = ... // The raw JSON you currently have.
Response response = new ObjectMapper().readValue(json, Response.class);
double latitude = response.results.get(0).geometry.location.latitude;