2012-04-25 15 views
3

GoogleジオコーディングAPIを使用して逆ジオコーディングを実行しています。Json Treeで名前でノードを見つける方法は?

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

を。

これをすべて実行することなく、位置ノードへの直接参照を取得できますか?例えば。私はジャクソンAPIでJsonNodeとツリー上のドキュメントを読みましたが、彼らはあなたがツリー全体をトラバースする場合にのみ便利です思える

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

- のようなものがあります。

特定のノードだけをフェッチする最も簡単な方法は何でしょうか?

答えて

3

+1ジオコーディングライブラリを指摘してください。シングルユースケースを扱う

ObjectMapper mapper = new ObjectMapper(); 

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

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

私が取ったアプローチではないとしても、元の質問に実際に答えるため+1。 :) –

1

「名前によるノードの検索方法」に関する質問には答えがありませんが、このデータをより明確に読み取る方法をお探しの場合は、これらの方法のいずれかをお勧めします。順序:

回答: GoogleのジオコーディングAPI用の既存のJavaライブラリを探します。今のところ、このデータのJava(Apache HttpClientなどを使用して)でHTTPリクエストを作成してから、JSONをJacksonと解析すると、おそらく誰かがこれまでの作業を全て行い、ライブラリにパッケージ化しています。クイック検索はこれをもたらした: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

-

はしかし、ドキュメントを掘り後、私は最終的に解決策を見つけました。距離を見つけたり、ルートを検索したり、住所検索を行ったりするときも同じことをしてください。もう少し一般的なものを見つけようとしています。 –

+0

私はこのライブラリを使用することで、すべてのユースケースを簡単にすることができると思います。これは、あなたが読もうとしているプロパティに関係なく、Map より優れているジオコーディングJSONのJavaクラス表現を提供します。 2番目の提案には、あなたの質問で言及した特定のプロパティのみが含まれていましたが、それはそのJSONの構造全体をわかりませんからです。おそらく、緯度/経度だけでなくJSONのすべてのプロパティとクラスを追加したいと思うでしょう。あなたがライブラリを使うことができれば、その努力は浪費されます。 –

関連する問題