2016-06-09 2 views
0

그리 일반적인 상황이 아닙니다.
여기 {"SomeElements":[{"Id":"Title","Info":"{\"Text\": \"Sometext\"}"}]}deserialized 문자열에 다른 JSON이 포함 된 경우 GSON

그것의 그래픽 표현입니다 :

enter image description here

문제는 그 문자열 Info 다른 JSON 문자열이 포함되어있다

나는 서버에서 다음 JSON 문자열을 가지고있다. 하지 문자열로 Info 문자열을 구문 분석하는 몇 가지 방법이 있지만, HashMap의 등 (예를 들어) 내 POJO에 -

public class Test { 
    private ArrayList<SomeElement> SomeElements; 

    public class SomeElement { 
     private String Id; 
     private String Info; 
    } 
} 

질문 : 여기
내 POJO입니까?

HashMap<String, String>으로 신고하려고하면 "Expected OBJECT, but was STRING" 오류가 있습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 사용자 지정 디시리얼라이저가 유일한 방법입니까?


!!이 질문은 중복되지 않습니다 !!
서버에서 JSON 응답을 변경할 수 없습니다.
주의 깊게 읽으십시오 - Info 문자열을 문자열이 아닌 다른 JSON으로 구문 분석 할 수 있습니까?

해결책 나는 다음으로 끝났다.
private LinkedTreeMap<String, String> infoMap;을 선언하고 Info을 문자열로 먼저 deserialize하십시오. 그런 다음 :

public LinkedTreeMap<String, String> getInfoMap() { 
      if (infoMap == null) { 
       infoMap = new Gson().fromJson(info, new TypeToken<Map<String, String>>(){}.getType()); 
      } 
      return infoMap; 
     } 

나는이 정의 디시리얼라이저를 쓰는 것보다 훨씬 더 쉽게 생각하지만, 어쩌면 더 복잡한 경우에 사용자 정의 디시리얼라이저가 유일한 선택이 될 것입니다.
그래서 일반적으로 @arjabbar의 대답이 더 잘 작동합니다.

+0

당신이 그것을하고 싶은 이유는 무엇입니까? – once2go

+0

간단 - 서버 측의 응답을 사용 가능한 클래스로 구문 분석하려고합니다. –

답변

1

두 가지 옵션이 있지만 최선의 방법은 사용자 지정 디시리얼라이저를 만드는 것입니다. 유일한 방법은 아니지만 디시리얼라이저 작성에 익숙해지면 그렇게 나쁘지 않습니다.

Here are some decent examples.

+0

그래, 사용자 지정 Deserializer가 유일한 옵션 일 것이라고 생각합니다. Info가 String이라는 주된 문제 - JSON을 중첩하면 쉽게 될 것입니다. –

0

여기도 정보가 대상입니다. 그래서 당신은 정보를위한 클래스를 생성해야합니다. GSON 당신을 위해 그것을 역 직렬화 수 있도록

public class Test { 
    private ArrayList<SomeElement> SomeElements; 

    public class SomeElement { 
     private String Id; 
     private Info info; 
    } 

} 
class Info{ 
private String text; 
private String sometext; 
//getter and setter 
} 
+0

Info가 문자열이기 때문에 작동하지 않습니다. com.google.gson.JsonSyntaxException : java.lang.IllegalStateException : BEGIN_OBJECT가 예상되었지만 1 행 46 줄에있는 문자열입니다. –

0

당신은뿐만 아니라 Info 객체에 대한 클래스를 작성해야합니다.

이 시도 :

public class EntireJsonObject { 
    private ArrayList<SomeElement> someElements; 
} 

public class SomeElement { 
    private String id; 
    private Info info; 
} 

public class Info { 
    private String text; 
} 

당신은 GSONEntireJsonObject에 서버에서 JSON 응답을 역 직렬화가 필요합니다.GSON은 모든 내부 변환과 비 직렬화를 처리합니다. 이제 Info 개체의 게터를 통해 "SomeText"에 액세스 할 수 있습니다.

변수 이름 이 아니 어서 JSON 응답에 반환 된 키와 정확히 일치해야한다는 점에 유의해야합니다. GSON은 다양한 스키마 (camelCase, under_scores 등)에 따라 변수 이름을 변환합니다. 개체를 만들 때 사용하는 변환 프로토콜 GSON을 지정할 수 있습니다.

InfoHashMap<String, String>으로하고 싶다면 개별적으로 디시리얼라이저를 작성해야합니다. 전체 JSON 응답에 대한 사용자 지정 디시리얼라이저를 작성할 필요가 없으므로 GSON 문서를 확인합니다. 내부 개체 만 사용하십시오.

+0

감사하지만 작동하지 않습니다 - 이유가 같습니다. Info는 문자열입니다. com.google.gson.JsonSyntaxException : java.lang.IllegalStateException : BEGIN_OBJECT가 예상되었지만 1 행 째 줄에 STRING 인 경우 46 ' –

+0

@GoltsevEugene 아, 알겠습니다. 전체 필드가 ​​따옴표로 묶여 있음을 알지 못했습니다. 이 경우 위에서 설명한 arjabbar로 사용자 정의 디시리얼라이저를 사용해야합니다. – omkarmoghe

관련 문제