2016-06-13 2 views
0

다음과 같이 json 객체가 있습니다.두 가지 형식의 객체가있는 JSON 구문 분석

{ 
    "products": [ 
     { 
      "details": { 
       "name": "xxx", 
       "price": "100rs" 
      }, 
      "description": "Buy this product" 

     }, { 
      "details": [{ 
       "name": "yyy", 
       "price": "200rs" 
      }], 
      "description": "another project" 
     } 
    ] 
} 

여기서 details은 2 가지 형식으로 표시됩니다. 개선 된 API에 사용할 POJO (Plain Old Java Object) 클래스를 어떻게 만들 수 있습니까?

+2

아니 자바 전문가,하지만 난 당신이 하나 개의 클래스에 같은 이름을 가진 두 개의 필드를 가질 수 없습니다 같아요. 하나는 "세부 사항"이어야하고 다른 하나는 "세부 사항"이어야합니다. –

+0

이 온라인 도구를 사용하면 도움이 될 것입니다 .. http://pojo.sodhanalibrary.com/ –

+0

나는이 사람과 같은 사용자 지정 디시리얼라이저를 작성할 수 있다고 생각합니다. http://stackoverflow.com/questions/35502079/custom- converter-for-retrofit-2 – nasch

답변

0

나는 그것이 나쁜 API 응답이라고 생각하고 백엔드에서 고쳐야한다. 그러나 문제를 해결하려면 문자열 변환기를 사용하여 String에 대한 응답을 deserialize해야합니다. Gson 변환기를 사용하여 Pojo에 deserialize 할 수 없습니다.

StringConverter.java

public class StringConverter implements Converter { 

    @Override 
    public Object fromBody(TypedInput typedInput, Type type) throws ConversionException { 
     String text = null; 
     try { 
      text = fromStream(typedInput.in()); 
     } catch (IOException ignored) { } 

     return text; 
    } 

    @Override 
    public TypedOutput toBody(Object o) { 
     return null; 
    } 

    public static String fromStream(InputStream in) throws IOException  { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     StringBuilder out = new StringBuilder(); 
     String newLine = System.getProperty("line.separator"); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      out.append(line); 
      out.append(newLine); 
     } 
     return out.toString(); 
    } 
} 

API 호출 구현

RestAdapter restAdapter = new RestAdapter.Builder() 
      .setEndpoint(API_URL) 
      .setConverter(new StringConverter()) 
      .build(); 

YourAPI api = restAdapter.create(YourAPI.class); 
api.yourService(parameter,new RestCallback<String>() { 

    @Override 
    public void success(String response, Response retrofitResponse) { 
     super.success(response, retrofitResponse); 
     //process your response here 
     //convert it from string to your POJO, JSON Object, or JSONArray manually 

    } 

    @Override 
    public void failure(RetrofitError error) { 
     super.failure(error); 
    } 

}); 
+0

예, api를 수정해야합니다. –