2012-04-25 2 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")); 

합니다.

이 모든 것을 수행하지 않고 위치 노드에 대한 직접 참조를 얻을 수 있습니까? 예 :

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

내가 잭슨 API의 JsonNode과 나무에 대한 문서를 읽고 있지만, 당신이 전체 트리를 탐색하려는 경우에만 그들은 유용한 것 - 같은있다.

특정 노드 만 가져 오는 가장 쉬운 방법은 무엇입니까?

답변

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 라이브러리를 찾습니다. 지금이 데이터에 대한 HTTP 요청을 Apache HttpClient 등을 사용하여 Java로 작성한 다음 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 클래스 표현을 제공합니다. 두 번째 제안에는 질문에 언급 한 특정 속성 만 포함되어 있지만 JSON의 전체 구조를 알지 못해서입니다. 아마 위도/경도뿐만 아니라 JSON의 모든 것에 대해 속성과 클래스를 추가하고 싶을 것입니다. 라이브러리를 사용할 수 있다면 그 노력은 낭비됩니다. –

관련 문제