2012-11-02 5 views
2

JSON을 Java 객체로 구문 분석 (및 생성)하기 위해 여러 JSON 라이브러리를 사용하는 여러 가지 기사, 비교 및 ​​자습서를 읽었습니다. 어쨌든 나는 잭슨 라이브러리 Jackson을 사용하기로 결정했다는 사실을 알았습니다.Android JSON 파싱 (Jackson)

GSON은 간단하고 견고하지만 나에게 느리다. 그래서 실제로이 Jackson의 것을 시험해보기로 결정했지만, 파싱이 GSON보다 조금 혼란 스러울 것 같습니다.

구문 분석하려는 값의 데이터 형식은 간단히 부울입니다. 그래서 실제로으로 그 값을 분석 한 후 키 FooResult에서 값을 선택하는 것입니다 도움과 필요

{"FooResult":true} 

:

내가 노력하고있어 JSON 같은 외모를 구문 분석하는 것입니다 Boolean.

내가 지금까지 한 일이다 :

String json = getString(request); 
ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(json, Boolean.class); 

그러나이 코드는 분명 나에게 내가 내가 독서에 관심 해요 FooResult 열쇠라고 선택하지 않은 오류의 원인을 제공 &은 부울로 파싱됩니다.

+0

mapper.readValue (json, Boolean.class); - JSON은 부울 유형/값을 나타내지 않으므로이 방법은 작동하지 않습니다. JSON은 단일 속성을 가진 객체이며 해당 속성은 부울 (또는 부울) 유형 값입니다. –

답변

5

이 같은 새로운 클래스 만들어야합니다

class MyClass { 
    public boolean FooResult; 
} 

을 그리고 데이터를로드하는 코드를 사용

MyClass myObject = mapper.readValue(json, MyClass.class);

그런 다음 당신이 값에 액세스 할 수 있습니다 myObject.FooResult

+0

유감스럽게도 이것이 작동하지 않습니다. 잭슨 라이브러리가 Bean으로 나를 위해 객체를 비 직렬화 할 수 없다는 것을 알려주는 JsonMappingException이 발생합니다. – parek

+1

Simon의 답변이 정확합니다. FooResult 필드를 공용 멤버로 정의 할 필요는 없습니다. –

+0

예, Jackson을 Reflection을 사용하여 값을 읽거나 쓰는 덕분에 실제로 private 멤버로 정의하기도합니다. 나는 보통이 클래스들을 자신의 자바 파일에 넣지 만, 정적 인 @Parek을 사용하면 아래에서 제안 할 수있다. –

0

좋아, 이것은 절름발이 다. 나도 그것에 대해 생각할 때 lamer. 문제는 당신이 구문 분석하고자하는 객체의 클래스가 이되어야한다는 것이 었습니다. 나는 오늘이 질문을 게시하기도 전에 Simon이 4 ~ 5 번 제안한 것을 시도했지만, 항상 문제가되는 것은 클래스가 이 아니었다는 것입니다.

이제는 결국 작동합니다.

static class FooClass 
{ 
    public boolean FooResult; 
} 

및 구문 분석 프로세스 용.

String json = getString(request); 
ObjectMapper mapper = new ObjectMapper(); 
FooClass fooClass = null; 
try 
{ 
    fooClass = mapper.readValue(json, FooClass.class); 
} 
boolean result = fooClass.FooResult; 
+2

"구문 분석하려는 개체의 클래스가 정적이어야합니다."- 정확하지 않습니다. 나는 당신이 목표 클래스를 다른 것의 내부 클래스로 선언하고 있다고 생각한다. 어쩌면 FooClass 클래스 선언을 다른 클래스의 선언 외부로 옮겨야 할 수도 있습니다. 내가 기억 하듯이 Gson은 Jackson과 약간 다른 방식으로 내부 클래스 (de) 직렬화를 처리합니다. 그래서, 아마도 Gson 솔루션이 Jackson과 정확히 같은 방식으로 작동하지 않은 이유 일 수 있습니다. –

+0

FWIW, 비 정적 내부 클래스가 작동하지 않는 이유는 주변 클래스의 인스턴스 ("implicit this pointer")에 대한 참조를 가져와야하기 때문입니다. 그리고 이것은 일반적으로 deserialization 중에는 사용할 수 없습니다. 적어도 당신의보기에는 주변 POJO가 없습니다. 이론적으로 부모 참조로 'null'을 전달하여 작동하도록 만들 수 있습니다 ... 다른 이상한 문제를 일으킬 수는 있지만 적어도 비 직렬화 될 것입니다. – StaxMan