2016-03-24 7 views
-1

Ich arbeite an einer Android-App, wo ich einen Web-Service-Aufruf habe und dieser Dienst gibt mir ein Json-Objekt als Antwort, aber in einigen Fällen ist es eine andere Struktur zurückkehren, finden Sie die Struktur:Parsen eines inkonsistenten JSON (verschiedene JSON-Struktur für den gleichen API-Aufruf) mit Gson Library

Fall 1: Json Struktur die Json haben Schlüssel „von“ und „zu“, die vom Typ String sind genannt.

Ex: "bis": "BVRT", "aus": "NS",

Fall 2: Json Struktur Die Json Schlüssel namens "von" und "zu" haben, die von benutzerdefiniertes Objekt ex: "aus": { "name": "BANGALORE CY JN", "Code": "SBC" }, "auf": { "name": "BHIMAVARAMTOWN", "code" : "BVRT" },

Da es viele verschachtelte Objekte gibt, verwende ich Gson Library, um das JSON-Objekt zu analysieren, das das Leben einfacher macht, anstatt manuell zu analysieren.

Ausgabe Facing Wie kann ich meine pojo Klasse konstruieren, da es zwei verschiedene Strukturen für die gleichen API-Aufruf, ich habe versucht, JsonIgnore aber es hat nicht funktioniert, da es die gleichen json Schlüssel in hat die beiden Fälle.

Zum besseren Verständnis finden Sie den Screenshot, der die komplette JSon-Struktur hat, in der Hoffnung eine Antwort mit Beispielcode-Snippet, da dies ein Blocker war, für den wir keine weitere Funktionalität der App erreichen konnten. Json Structure

+0

Bitte lassen Sie mich den Grund für die Abstimmung unten wissen, wenn meine Frage falsch ist, sind dies die API von Railwayapi gegeben.com, die die unterschiedliche JSON-Struktur für den gleichen API-Aufruf – manideep

+1

Verwenden Sie Objekt statt String beim Parsen, manuell die Logik durch die Identifizierung der Objekt Wert –

+0

@HarshaVardhan Ich habe sogar versucht, die vorgeschlagene Vorgehensweise, aber um zu überprüfen, ob das Ergebnis ist string oder benutzerdefiniertes Objekt Ich muss instancOf() verwenden, aber wenn es String ist, wird es automatisch zugeordnet, wenn es ein benutzerdefiniertes Objekt ist, das nicht identifiziert werden kann, und ich erwähnte, dass es ein riesiger json mit vielen Beziehungen ist und zwei Formen von Modellobjekt und wie kann ich wissen, welches Modellobjekt und wie kann ich entscheiden, welche Version des Modellobjekts verwendet werden soll, um die Ergebnisse zuUI anzuzeigen, so möchte ich wissen, ob es einen anderen Weg gibt, der dem Zweck dient – manideep

Antwort

0

Nach Forschung von wenigen Stunden habe ich eine Lösung für diese, hier meine Lösung funktioniert ohne gesonderte Modellklassen zu schaffen unterschiedliche Json Strukturen für gleiche API-Aufruf zu behandeln:

Model-Klasse

public class TrainDetails { 

    @SerializedName("to") 
    private String toString; 


    @SerializedName("from") 
    private String fromString; 


    @SerializedName("to") 
    private ToStationPnrPojo fromStationObject; 


    @SerializedName("from") 
    private ToStationPnrPojo toStationObject; 
} 

Konstruieren Sie nun ein Gson-Objekt mit ExclusionStrategy. Hier können Sie angeben, welche Felder Sie in unserer Modellklasse ausschließen müssen, um die von der Serverseite gesendete JSon-Struktur abzugleichen.

try { 
       JSONObject jsonObject=new JSONObject(result); 
       JSONArray jsonArray=jsonObject.optJSONArray("train"); 
       if(jsonArray.length()>0){ 
        JSONObject jsonObject1= jsonArray.getJSONObject(0); 
        Object test=jsonObject1.get("to"); 
        if(test instanceof String){ 
         Log.e("Test","Instance OF String"); 
         CustomExclusionStrategy ges = new CustomExclusionStrategy(TrainDetails.class, "toStationObject","fromStationObject"); 
         gson= new GsonBuilder().setExclusionStrategies(new CustomExclusionStrategy[]{ges}).create(); 


       }else{ 
         Log.e("Test","Instance OF Custom object"); 
         CustomExclusionStrategy ges = new CustomExclusionStrategy(TrainDetails.class, "toString","fromString"); 
         gson= new GsonBuilder().setExclusionStrategies(new CustomExclusionStrategy[]{ges}).create(); 

       } 
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

Wir können die Felder Namen CustomeExclusionStrategy Angabe Gson übergeben, die diese Felder ausschließen, während die Json vom Server Parsen.

CustomExclusionStrategy

public class CustomExclusionStrategy implements ExclusionStrategy { 
    private final List<String> _skipFields = new ArrayList<String>(); 
    private final Class<?> _clazz; 


    public CustomExclusionStrategy(Class<?> clazz, String... fields) { 
     _clazz = clazz; 

     for (String field : fields) { 
      _skipFields.add(field); 
     } 
    } 

    @Override 
    public boolean shouldSkipClass(Class<?> clazz) { 
     return false; 
    } 

    @Override 
    public boolean shouldSkipField(FieldAttributes f) { 
     return f.getDeclaringClass() == _clazz 
       && _skipFields.contains(f.getName()); 
    } 
} 

hoffen, dass dies hilfreich sein, wenn andere das ähnliche Problem konfrontiert wurden, während mit Parsen von Json zu tun, die nicht in der Client-Anwendung Kontrolle ist.