6

Google ジオコーディング 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();

JsonNode と Tree in Jackson Api のドキュメントを読みましたが、ツリー全体をトラバースしたい場合にのみ役立つようです。

特定のノードのみを取得する最も簡単な方法は何ですか?

4

2 に答える 2

7

ジオコーディング ライブラリを指摘してくれた Michael Hixson に +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

「名前でノードを見つける方法」の質問に対する答えはありませんが、このデータをよりクリーンに読み取る方法を探している場合は、次のいずれかの方法を順番に使用することをお勧めします。

A: Google の Geocoding 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;
于 2012-04-26T02:26:55.173 に答える