6

我正在使用谷歌地理编码 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 的文档,但似乎它们仅在您想遍历整个树时才有用。

仅获取特定节点的最简单方法是什么?

4

2 回答 2

7

+1 迈克尔希克森指出地理编码库。

但是,在深入研究文档后,我终于找到了解决方案 -

ObjectMapper mapper = new ObjectMapper(); 

JsonNode rootNode = mapper.readTree(mapper.getJsonFactory()
                        .createJsonParser(response.getEntity(String.class)));

rootNode.findValue("lat").getDoubleValue();
于 2012-04-26T04:43:36.017 回答
1

对于您的“如何按名称查找节点”问题,我没有答案,但如果您只是在寻找一种更简洁的方式来读取这些数据,那么我会推荐其中一种方法,按顺序:

答:为 Google 的地理编码 API 寻找预先存在的 Java 库。如果现在你在 Java 中对这些数据发出 HTTP 请求(使用 Apache HttpClient 或其他东西),然后用 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;
于 2012-04-26T02:26:55.173 回答