【问题标题】:How to find a node by name in a Json Tree?如何在 Json 树中按名称查找节点?
【发布时间】:2012-04-25 14:14:19
【问题描述】:

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

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

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    +1 感谢 Michael Hixson 指出地理编码库。

    但是,在翻阅文档后,我终于找到了解决方案 -

    ObjectMapper mapper = new ObjectMapper(); 
    
    JsonNode rootNode = mapper.readTree(mapper.getJsonFactory()
                            .createJsonParser(response.getEntity(String.class)));
    
    rootNode.findValue("lat").getDoubleValue();
    

    【讨论】:

    • +1 用于实际回答原始问题,即使这不是我会采取的方法。 :)
    【解决方案2】:

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

    答:为 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 和您的根“响应”类提供给 Jackson。我很确定它可以从 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;
    

    【讨论】:

    • 解决单个用例。在查找距离、获取方向或执行地址查找时,我是否应该这样做?我正在尝试找到更通用的东西。
    • 我认为使用我建议的那个库会让你的所有用例变得更容易。它为您提供地理编码 JSON 的 Java 类表示,无论您尝试读取什么属性,它都将优于 Map。我的第二个建议仅包括您在问题中提到的特定属性,但这只是因为我不知道该 JSON 的整个结构。大概您想为 JSON 中的所有内容添加属性和类,而不仅仅是纬度/经度。不过,如果您可以只使用该库,那么这种努力就白费了。
    猜你喜欢
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多