2013-05-16 5 views
20

다음 JSON이 있는데 요소를 가져 오는 데에만 관심이 있습니다. "status", "lat""lng"입니다.많은 클래스가없는 GSON 구문 분석

Gson을 사용하면이 JSON을 구문 분석하여 JSON 콘텐츠를 나타내는 전체 클래스 구조를 만들지 않고이 값을 얻을 수 있습니까?

JSON :

{ 
    "result": { 
    "geometry": { 
     "location": { 
     "lat": 45.80355369999999, 
     "lng": 15.9363229 
     } 
    } 
    }, 
    "status": "OK" 
} 
+2

귀하의 JSON이 유효하지 않습니다 ([jsonlint] (http://jsonlint.com)으로 확인할 수 있습니다.) 'address_components'의 내부'geometry' 속성은 객체에 래핑되어야합니다 ('{} '중괄호 사용). – Perception

+0

필자는 많은 불필요한 노드를 잘라 내고 오타가 발생했다 :-) – Reeebuuk

+0

그래서 올바른 형태는 무엇일까요? 그것을 알지 못하면서도 빠른 해결책을 제안 할 수는 없습니다. – Perception

답변

32

새 클래스를 정의 할 필요가 없으며 JSON Gson 라이브러리와 함께 제공되는 개체. 간단한 예를 들어 보겠습니다.

JsonParser parser = new JsonParser(); 
JsonObject rootObj = parser.parse(json).getAsJsonObject(); 
JsonObject locObj = rootObj.getAsJsonObject("result") 
    .getAsJsonObject("geometry").getAsJsonObject("location"); 

String status = rootObj.get("status").getAsString(); 
String lat = locObj.get("lat").getAsString(); 
String lng = locObj.get("lng").getAsString(); 

System.out.printf("Status: %s, Latitude: %s, Longitude: %s\n", status, 
     lat, lng); 

일반적이고 간단합니다. 동일한 코드를 반복해서 반복한다면 클래스를 만들어 매핑을 단순화하고 반복을 제거 할 수 있습니다.

+0

사용자 지정 디시리얼라이저가없는 좋은 솔루션! 어쨌든이 방법은 유지하고 재사용하기가 훨씬 더 어렵다고 생각합니다 ... 클래스를 사용하여 일반적인 구문 분석을하는 것이 더 좋고 우아하다고 생각하지 않습니까? – MikO

+0

당신과 MikOs 솔루션간에 성능 차이가 있습니까? – Reeebuuk

+1

작은 입력 데이터의 경우 성능 향상은 무시할 수 있습니다. 더 큰 데이터 세트의 경우 매핑 된 POJO를 관리하는 데 약간의 시간이 절약됩니다. 그러나 다른 방법보다 한 가지 방법을 사용하면 성능에서 어떤 이득도 얻지 못하는 것보다 훨씬 많은 것을 유도해야합니다 (예 : 들어오는 데이터의 복잡성으로 인해 매핑 클래스를 불필요하게 지루하게 만들 수 있음). – Perception

5

그것은 참으로 가능하지만, 당신이 디시리얼라이저 정의를 만들어야합니다. 자세한 정보는 Gson 설명서 here 및 Gson API Javadoc here을 참조하십시오. 또한 herehere ... 다른 답변을 살펴보고 의심이 있으면 의견을 말하십시오.

그건 내 생각에 특출 한 JSON 응답의 단순성을 고려하여 상응하는 클래스를 만드는 것이 훨씬 더 쉽습니다. 일반적인 접근 방식을 사용하면, 간단한 클래스는 복잡하지는 않지만 사용자 정의 디시리얼라이저를 작성하면 더 오래 걸릴 것이고 나중에 JSON의 일부 데이터가 필요하면 적응하기가 더 어려울 것입니다 ...

Gson 해결 방법을 찾지 않고 개발자가 사용할 수 있도록 설계된 운영 방법이 있습니다!

어쨌든 왜 수업을 사용하지 않으시겠습니까? 프로젝트에 많은 클래스를 갖고 싶지 않다면 중첩 클래스를 사용하면 프로젝트가보다 깨끗해질 것입니다 ...

+0

그런 말을 할 때 나는 당신에게 동의한다. 나는 모든 수업을 생성하려고 노력할 것이고 여기에 몇 가지 문제가있을 것입니다. – Reeebuuk

+0

그냥 JsonObject 대신 deserialize하여 케이스에 넣으십시오. – eugen

+0

완료하고 중첩 된 클래스를 만들면 모든 것이 잘됩니다. Thx to all :-) – Reeebuuk

관련 문제