2016-09-09 6 views
0

Ich habe die Nachrüstung SDK für die Herstellung von API-Anruf verwendet. Ich habe GSON SDK zum Parsen der Antwort. Ich habe etwas schwierig, die JSON-Antwort zu analysieren. Ich habe die JSON-Antwort geschrieben, die unten analysiert werden soll. Ich muss die Adresszeile Arraylist erhalten.Parse JSON Antwort mit GSON in reterofit

Ich bekomme Null Daten von der Liste.

{ 
    "QA": { 
     "CreditsUsed": 1, 
     "State": "Results" 
    }, 
    "SearchResult": { 
     "VerifyLevel": "Verified", 
     "Address": { 
      "AddressLine": [{ 
       "LineContent": "None", 
       "Label": {}, 
       "Line": "2500Kearney St" 
      }, { 
       "LineContent": "None", 
       "Label": {}, 
       "Line": {} 
      }, { 
       "LineContent": "None", 
       "Label": {}, 
       "Line": {} 
      }, { 
       "Label": "City name", 
       "Line": "Springfield" 
      }, { 
       "Label": "State code", 
       "Line": "MO" 
      }, { 
       "Label": {}, 
       "Line": "65803-5048" 
      }, { 
       "Label": "Country", 
       "Line": "UNITED STATES OF AMERICA" 
      }], 
      "DPVStatus": "DPVNotConfigured" 
     }, 
     "VerificationFlags": { 
      "StateProvinceChanged": true, 
      "PostCodeCorrected": true 
     } 
    } 
} 

Modellklasse

public class DineshValues { 

    String Country; 
    String Search; 
    @SerializedName("LineContent") 
    String LineContent; 
    @SerializedName("Line") 
    String Line; 
    @SerializedName("AddressLine") 
    List<AddressLine> data=new ArrayList(); 

    public List<AddressLine> getData() { 
     return data; 
    } 

    public String getLineContent() { 
     return LineContent; 
    } 

    public void setLineContent(String lineContent) { 
     LineContent = lineContent; 
    } 

    public String getLine() { 
     return Line; 
    } 

    public void setLine(String line) { 
     Line = line; 
    } 

    public void setData(List<AddressLine> data) { 
     this.data = data; 
    } 
    public String getCountry() { 
     return Country; 
    } 

    public void setCountry(String country) { 
     Country = country; 
    } 

    public String getSearch() { 
     return Search; 
    } 

    public void setSearch(String search) { 
     Search = search; 
    } 
} 

Addressklassendatei

public class AddressLine { 

@SerializedName("LineContent") 
@Expose 
private String lineContent; 
@SerializedName("Label") 
@Expose 
private String label; 
@SerializedName("Line") 
@Expose 
private String line; 

/** 
* 
* @return 
* The lineContent 
*/ 
public String getLineContent() { 
return lineContent; 
} 

/** 
* 
* @param lineContent 
* The LineContent 
*/ 
public void setLineContent(String lineContent) { 
this.lineContent = lineContent; 
} 

/** 
* 
* @return 
* The label 
*/ 
public String getLabel() { 
return label; 
} 

/** 
* 
* @param label 
* The Label 
*/ 
public void setLabel(String label) { 
this.label = label; 
} 

/** 
* 
* @return 
* The line 
*/ 
public String getLine() { 
return line; 
} 

/** 
* 
* @param line 
* The Line 
*/ 
public void setLine(String line) { 
this.line = line; 
} 

wie diese genannt

RetrofitRest.getClient().getLogin("1111111" ,obj,new Callback<DineshValues >() { 

    @Override 
     public void success(DineshValues arg0, Response arg1) { 
      // TODO Auto-generated method stub 
      Log.e("size",arg0.getData+""); 
     } 
} 
+0

Erhalten Sie eine Ausnahme? Wenn ja, dann bearbeiten Sie die Frage und fügen Sie den vollständigen Logcat-Bericht hinzu. Ich denke, wenn Sie versuchen, arg0.getData zu drucken, druckt es Objektadresse. Tun Sie eine Sache in der AddressLine überschreiben ToString-Methode. Oder geh für arg0.getData.get (0) .getLineContent() –

+0

09-09 05: 54: 53.515: E/AndroidRuntime (1411): java.lang.IndexOutOfBoundsException: Ungültiger Index 0, Größe ist 0 Ich bekomme den Fehler während Ich benutze arg0.getData.get (0) .getLineContent(). –

+0

Ich denke, ich habe etwas falsch gemacht über das Erstellen von Pojo-Klasse für die gegebene Antwort ... können Sie meine Pojo-Klasse überprüfen? –

Antwort

0

ich die json extra behoben haben "" wie unten gezeigt .

"StateTransition":"SearchResults", 

Nach dem Parsen von rektifiziertem json in http://www.jsoneditoronline.org/. Mir ist aufgefallen, dass du in deinem jsonObject noch 2 jsonObject mit den Schlüsseln "CAB" und "Result" hast. In Ihrem zweiten jsonObject haben Sie ein anderes jsonObject mit dem Schlüssel "Address", innerhalb dessen Sie das Array "AddressLine" haben.

SO Bitte korrigieren Sie die komplette pojo DineshValues. Wenn Sie weitere Hilfe benötigen, dann lassen Sie mich wissen, ich komplett POJO hinzufügen wird

UPDATE
Lösung 1-
Wie in Kommentar erwähnt, dass Sie jsonschema2pojo pojo zu erzeugen, verwendet, können Sie diese Klassen halten die könnte einfach den Code und verwenden Sie die folgende Zeile Adresse zu extrahieren

List<AddressLine> addressLine = arg0.getResult().getAddress().getAddressLine() 

Jetzt Adresszeile durchlaufen und die Daten extrahieren, die Sie benötigen.

Hinweis - 1) Stellen Sie sicher, dass arg0 vom Typ class für root JsonObject ist.
2) Ein weiterer Punkt ist wie erwähnt von cricket_007 - Jedes Label und Zeile Attribut sind keine Zeichenfolgen, sie sind Objekte, wie von {}.


Lösung 2-
Sie nur die Address Klasse aus der generierten Klassendatei in Ihrem Projekt behalten und verwenden Sie die folgenden Zeilen Adresse zu extrahieren.

RetrofitRest.getClient().getLogin("1111111" ,obj,new Callback<DineshValues >() { 

    @Override 
     public void success(String arg0, Response arg1) { 
      // TODO Auto-generated method stub 
      JsonObject rootJsonObject = new JsonObject(arg0); 
      JsonObject searchResultJsonObject = rootJsonObject.getJsonObject("SearchResult"); 
      JsonObject addressJsonObject = searchResultJsonObject.getJsonObject("Address") 

      Type listType = new TypeToken<List<AddressLine>>(){}.getType(); 
      List<AddressLine> addressLineList = gson.fromJson(addressJsonObject, listType); 
      //Now iterate the addressLineList to get the address 
      Log.e("size",addressLineList.getSize+""); 

     } 
} 
+0

@ cricket_007 Stimme absolut mit Ihnen überein. Anfangs dachte ich darüber nach, es als Kommentar hinzuzufügen. Also hatte ich den Tag benutzt. Danke für die Bearbeitung. –

+0

Ich habe die vollständige Antwort ... Ich muss ArrayList (AddressLine) bekommen..wie kann ich das bekommen ... bieten die Schritte, um es zu erreichen –

+0

geben Sie die Pojo-Klasse für die gegebene Antwort .. Ich habe (http://www.jsonschema2pojo.org/) für die Generierung pojo..aber ich generierte viele Klassen.aber ich brauche nur Adresswerte –

0

Bitte versuchen Sie es mit unter POJO,

Adresse

public class Address { 

    @SerializedName("AddressLine") 
    private List<AddressLine> addressLine = new ArrayList<AddressLine>(); 
    @SerializedName("DPVStatus") 
    private String dPVStatus; 

    /** 
    * 
    * @return 
    *  The addressLine 
    */ 
    public List<AddressLine> getAddressLine() { 
     return addressLine; 
    } 

    /** 
    * 
    * @param addressLine 
    *  The AddressLine 
    */ 
    public void setAddressLine(List<AddressLine> addressLine) { 
     this.addressLine = addressLine; 
    } 

    /** 
    * 
    * @return 
    *  The dPVStatus 
    */ 
    public String getDPVStatus() { 
     return dPVStatus; 
    } 

    /** 
    * 
    * @param dPVStatus 
    *  The DPVStatus 
    */ 
    public void setDPVStatus(String dPVStatus) { 
     this.dPVStatus = dPVStatus; 
    } 

} 

Address

public class AddressLine { 

    @SerializedName("LineContent") 
    private String lineContent; 
    @SerializedName("Label") 
    private String label; 
    @SerializedName("Line") 
    private String line; 

    /** 
    * 
    * @return 
    *  The lineContent 
    */ 
    public String getLineContent() { 
     return lineContent; 
    } 

    /** 
    * 
    * @param lineContent 
    *  The LineContent 
    */ 
    public void setLineContent(String lineContent) { 
     this.lineContent = lineContent; 
    } 

    /** 
    * 
    * @return 
    *  The label 
    */ 
    public String getLabel() { 
     return label; 
    } 

    /** 
    * 
    * @param label 
    *  The Label 
    */ 
    public void setLabel(String label) { 
     this.label = label; 
    } 

    /** 
    * 
    * @return 
    *  The line 
    */ 
    public String getLine() { 
     return line; 
    } 

    /** 
    * 
    * @param line 
    *  The Line 
    */ 
    public void setLine(String line) { 
     this.line = line; 
    } 

} 

Daten

public class Data { 

    @SerializedName("QA") 
    private QA qA; 
    @SerializedName("SearchResult") 
    private SearchResult searchResult; 

    /** 
    * 
    * @return 
    *  The qA 
    */ 
    public QA getQA() { 
     return qA; 
    } 

    /** 
    * 
    * @param qA 
    *  The QA 
    */ 
    public void setQA(QA qA) { 
     this.qA = qA; 
    } 

    /** 
    * 
    * @return 
    *  The searchResult 
    */ 
    public SearchResult getSearchResult() { 
     return searchResult; 
    } 

    /** 
    * 
    * @param searchResult 
    *  The SearchResult 
    */ 
    public void setSearchResult(SearchResult searchResult) { 
     this.searchResult = searchResult; 
    } 

} 

QA

public class QA { 

    @SerializedName("CreditsUsed") 
    private Long creditsUsed; 
    @SerializedName("State") 
    private String state; 

    /** 
    * 
    * @return 
    *  The creditsUsed 
    */ 
    public Long getCreditsUsed() { 
     return creditsUsed; 
    } 

    /** 
    * 
    * @param creditsUsed 
    *  The CreditsUsed 
    */ 
    public void setCreditsUsed(Long creditsUsed) { 
     this.creditsUsed = creditsUsed; 
    } 

    /** 
    * 
    * @return 
    *  The state 
    */ 
    public String getState() { 
     return state; 
    } 

    /** 
    * 
    * @param state 
    *  The State 
    */ 
    public void setState(String state) { 
     this.state = state; 
    } 

} 

Search

public class SearchResult { 

    @SerializedName("VerifyLevel") 
    private String verifyLevel; 
    @SerializedName("Address") 
    private Address address; 
    @SerializedName("VerificationFlags") 
    private VerificationFlags verificationFlags; 

    /** 
    * 
    * @return 
    *  The verifyLevel 
    */ 
    public String getVerifyLevel() { 
     return verifyLevel; 
    } 

    /** 
    * 
    * @param verifyLevel 
    *  The VerifyLevel 
    */ 
    public void setVerifyLevel(String verifyLevel) { 
     this.verifyLevel = verifyLevel; 
    } 

    /** 
    * 
    * @return 
    *  The address 
    */ 
    public Address getAddress() { 
     return address; 
    } 

    /** 
    * 
    * @param address 
    *  The Address 
    */ 
    public void setAddress(Address address) { 
     this.address = address; 
    } 

    /** 
    * 
    * @return 
    *  The verificationFlags 
    */ 
    public VerificationFlags getVerificationFlags() { 
     return verificationFlags; 
    } 

    /** 
    * 
    * @param verificationFlags 
    *  The VerificationFlags 
    */ 
    public void setVerificationFlags(VerificationFlags verificationFlags) { 
     this.verificationFlags = verificationFlags; 
    } 

} 

VerificationFlags

public class VerificationFlags { 

    @SerializedName("StateProvinceChanged") 
    private Boolean stateProvinceChanged; 
    @SerializedName("PostCodeCorrected") 
    private Boolean postCodeCorrected; 

    /** 
    * 
    * @return 
    *  The stateProvinceChanged 
    */ 
    public Boolean getStateProvinceChanged() { 
     return stateProvinceChanged; 
    } 

    /** 
    * 
    * @param stateProvinceChanged 
    *  The StateProvinceChanged 
    */ 
    public void setStateProvinceChanged(Boolean stateProvinceChanged) { 
     this.stateProvinceChanged = stateProvinceChanged; 
    } 

    /** 
    * 
    * @return 
    *  The postCodeCorrected 
    */ 
    public Boolean getPostCodeCorrected() { 
     return postCodeCorrected; 
    } 

    /** 
    * 
    * @param postCodeCorrected 
    *  The PostCodeCorrected 
    */ 
    public void setPostCodeCorrected(Boolean postCodeCorrected) { 
     this.postCodeCorrected = postCodeCorrected; 
    } 

} 

Retrofit Anruf

RetrofitRest.getClient().getLogin("your text", obj, new Callback<Data>() { 
      @Override 
      public void success(Data data, Response response) { 
       SearchResult searchResult = data.getSearchResult(); 
       if (searchResult != null) { 
        Address address = searchResult.getAddress(); 
        if (address != null && address.getAddressLine() != null) { 
         for (AddressLine addressLine : address.getAddressLine()) { 
          Log.d("TAG", "addressLine" + addressLine); 
         } 
        } 
       } 
      } 
     }); 
+0

Ich versuche all diese Dinge..aber ich bekomme immer noch Null auf Datenobjekt ...öffentlicher ungültiger Erfolg (Daten, Antwortantwort) { –

+0

String Country; \t Zeichenkettensuche; \t öffentliche Zeichenfolge getCountry() { \t \t Rückgabe Land; \t} \t public void setCountry (String Land) { \t \t Land = Land; \t} \t public String getSearch() { \t \t Rückkehr Suche; \t} \t public void setSearch (String-Suche) { \t \t Suche = Suche; \t} Daten obj = new Data(); \t \t obj.setCountry ("NewJersey"); \t \t obj.setSearch ("@ 2500 East Kearney Street, @, @, @ Springfield, @ MO, @ 65803"); –

+0

ich füge diese Zeilen in die Data Klasse für das Übergeben von Post Parametern zu reterofit hinzu –