2012-04-25 40 views
3

我正在使用谷歌地理編碼API進行反向地理編碼。如何在Json樹中按名稱查找節點?

結果以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")); 

如果響應包含的JSON服務器返回。

是否有可能直接引用位置節點而不經過所有這些?例如。是有什麼樣 -

new ObjectMapper().readValue(json).findNodeByName("lat").getFloatValue(); 

我已經閱讀並JsonNode樹傑克遜的API文檔,但似乎只有當你要遍歷整棵樹,他們是有用的。

什麼是僅提取特定節點的最簡單方法?

回答

3

+1給Michael Hixson指出地理編碼庫。

但是,通過文檔挖後,我終於找到了解決辦法 -

ObjectMapper mapper = new ObjectMapper(); 

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

rootNode.findValue("lat").getDoubleValue(); 
+2

+1實際回答原來的問題,即使這不是我會採取的方法。 :) – 2012-04-26 04:54:17

1

我沒有對「如何按名稱查找節點」問題的答案,但如果您只是在尋找更清晰的方式來閱讀此數據,那麼我會推薦其中一種方法,爲了:

- 答:尋找預先存在的谷歌地理編碼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; 
+0

這解決了一個用例。在尋找距離,獲取路線或執行地址查找時,我是否應該這樣做?我試圖找到一些更通用的東西。 – 2012-04-26 04:02:27

+0

我會認爲使用我建議的庫會使所有的用例更容易。它爲您提供了地理編碼JSON的Java類表示,無論您嘗試讀取哪些屬性,它都將優於Map 。我的第二個建議只包括你在問題中提到的特定屬性,但那是因爲我不知道JSON的整個結構。大概你想爲JSON中的所有內容添加屬性和類,而不僅僅是經緯度。如果你可以使用這個庫,那麼這個努力會被浪費掉。 – 2012-04-26 04:27:15