2016-06-13 6 views
0

Ich habe ein JSON-Objekt wie folgt.Parsing JSON, die ein Objekt in zwei Formaten hat

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

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

Hier sind die details in 2 Formaten dargestellt. Wie kann ich eine POJO-Klasse (Plain Old Java Object) für die Retrofit-API erstellen?

+2

kein Java-Experte, aber ich denke, man nicht zwei Felder mit dem gleichen Namen in einer Klasse haben kann. Man sollte zumindest "Detail" und die anderen "Details" sein. –

+0

Verwenden Sie dieses Online-Tool, hoffe, dass es Ihnen hilft .. http://pojo.sodhanalibrary.com/ –

+0

Ich denke, Sie können eine benutzerdefinierte Deserializer wie dieser Typ schreiben: http://StackOverflow.com/Questions/35502079/custom- Konverter-für-Retrofit-2 – nasch

Antwort

0

Ich denke, das ist schlechte API-Antwort und sollte aus dem Backend behoben werden. Wenn Sie jedoch das Problem lösen möchten, müssen Sie die Antwort auf String mit dem String-Konverter deserialisieren. Sie können es nicht mit einem Gson-Konverter zu Ihrem Pojo deserialisieren.

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-Aufruf Implementierung

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

Ja sieht aus wie api muss geändert werden. –