2016-08-17 3 views
0

Jeder.Null-Objekt in Retrofit2

Ich versuche, mit Retrofit2 eine Verbindung zu einem RestApi herzustellen, aber das gibt mir immer Fehler oder Rückgabewert Null.

{"news": [ { "News": { "id": "1", "title": "Big data is changing the ace f fashion", "description": "Download Fashioning Data: A 2015 Update" } }]} 

Ich habe den nächsten Code:

Schnittstelle

ruhen
@GET("news") 
Call<news> getNews(); 

POJO Objekt:

public class news { 

@SerializedName("News") 
public List<Listnews> listnews; 

public static class Listnews{ 

    public News news; 

    public static class News{ 

     @SerializedName("id") 
     private String id; 

     @SerializedName("title") 
     private String title; 

     @SerializedName("description") 
     private String description; 

     // getters and setters 
    } 

} 

und zeigen in der mainActivity

Call<news> call2 = api.getNews(); 

    call2.enqueue(new Callback<news>() { 

     @Override 
     public void onResponse(Call<news> call, Response<news> response) { 

      if (response.code() == 200){ 

       List<news.Listnews> respuesta = response.body().listnews; 

       System.out.println("title: "+ respuesta.get(0).news); 


      } 

     } 

     @Override 
     public void onFailure(Call<news> call, Throwable t) { 

      System.out.println(t + " Error "); 

     } 

    }); 

Aber das gibt immer Null zurück.

Antwort

2

tun Sie bitte die followin eine Menge Zeit in der Entwicklung sparen g ändert sich in deiner Klasse, hoffentlich sollte das funktionieren. Lass es mich wissen, wenn es nicht so ist.

public class news { 

// Change 1 --- 
@SerializedName("news") 
public List<Listnews> listnews; 

public static class Listnews{ 

// Change 2 --- 
@SerializedName("News") 
public News news; 

public static class News{ 

    @SerializedName("id") 
    private String id; 

    @SerializedName("title") 
    private String title; 

    @SerializedName("description") 
    private String description; 

    // getters and setters 
} } 
0

Sie haben zwei "Nachrichten", "Nachrichten" in Ihrem JSON-String.

Da Ihr Modell mit der

N ews (Array)

folgenden Anmerkungen versehen -> id

-> title

-> Beschreibung

{ 
    "News": [ 
     { "id": "1", "title": "Big data is changing the ace f fashion", "description": "Download Fashioning Data: A 2015 Update" }, 
     { "id": "2", "title": "Big data is changing the ace f fashion", "description": "Download Fashioning Data: A 2015 Update" } 
    ] 
} 

Aber in deiner JSON-Zeichenfolge

{ 
    "news": [{ 
     "News": { "id": "1", "title": "Big data is changing the ace f fashion", "description": "Download Fashioning Data: A 2015 Update" } 
    }] 
} 

können Sie die Struktur sehen:

Nachrichten (Array)

-> News (Objekte)

-> id

-> title

- > Beschreibung

Daher können Sie keine Daten darin phasieren.

Die oben ist der Grund, warum Sie Null-Objekt, und Sie sollten die erste json Struktur verwenden, um die Nachrichten-Daten

Im Folgenden ist der Vorschlag für Ihre Arbeit

  1. Dont verwirrt mit der get Wörter "Nachrichten" und die Datenstrukturen "Nachrichten" (http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api) Es ist in Ordnung für Sie, "Nachrichten" als den Weg zu verwenden, um die Liste der Nachrichten zu erhalten. Aber es wird schmerzhaft sein, wenn Sie eine andere "News" oder "Listnews" in der Rückkehr json haben, da es ziemlich verwirrt ist, herauszufinden, welche man die Nachrichten sein sollte. Versuchen Sie ein anderes Wort wie "Daten", "Artikel" oder einfach eine Arraylist der Nachrichten zurückgeben, da Ihr Weg (http://restful.com/news) Sie benachrichtigt, versuchen, die Liste der Nachrichten

  2. Build Test Case für Ihre erholsame.Es wird schmerzhaft sein, wenn Sie versuchen, jeden Rest api in Ihrer mobilen Anwendung zu testen. Versuchen Sie, die folgenden

    A. Erstellen Sie die Gerätetest (https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html) zu verwenden, um Sie auf den Button klicken, um die Demo erholsamen

    B. Mock die Anforderung mit Retrofit (https://github.com/square/okhttp/tree/master/mockwebserver) und kopieren Sie Ihre JSON-String in auszulösen die Escape-Zeichen ein (die Nutzung dieser Website http://bernhardhaeussner.de/odd/json-escape/)

Diese beiden Wege werden

0

Das funktionierte für mich. Ich weiß nicht, warum du die statische Klasse genommen hast. Ich habe es getan, einfach so:

POJO Klasse News.java:

public class News 
{ 
String id, title, description; 

public String getId() 
{ 
    return id; 
} 

public void setId(String id) 
{ 
    this.id = id; 
} 

public String getTitle() 
{ 
    return title; 
} 

public void setTitle(String title) 
{ 
    this.title = title; 
} 

public String getDescription() 
{ 
    return description; 
} 

public void setDescription(String description) 
{ 
    this.description = description; 
} 
} 

API-Schnittstelle:

public interface NewsAPI 
{ 
    @POST("/loltry.php") 
    Call<NewsList> getNews(); 
} 

NewsList.java:

public class NewsList 
{ 
    @SerializedName("news") 
    ArrayList<Data> d; 
} 

Data.java:

public class Data 
{ 
    @SerializedName("data") 
    News n; 
} 

NewsList newsList = response.body(); 

String rootUrl = "http://192.168.0.5"; 
Retrofit adapter = new Retrofit.Builder().baseUrl(rootUrl).addConverterFactory(GsonConverterFactory.create()).build(); 
NewsAPI newsAPI = adapter.create(NewsAPI.class); 
final Call<NewsList> call = newsAPI.getNews(); 
call.enqueue(new Callback<NewsList>() 
{ 
    @Override 
       public void onResponse(Call<NewsList> call, Response<NewsList> response) 
       { 
        Toast.makeText(MainActivity.this, "Succcessss", Toast.LENGTH_LONG).show(); 
        newsList = response.body(); 
        try 
        { 
         for (int i = 0; i < newsList.d.size(); ++i) 
         { 
           newsListArray.add(i, newsList.d.get(i).n.getTitle()); 
         } 
        } catch (Exception e) 
        { 
          e.printStackTrace(); 
        } 
       } 

Hier loltry.php auf meinem localhost sendet json Objekt, das Sie versuchen zu analysieren. Und ich zeige den Titel in Ihrem "News" (mein "Daten") Objekt in einer Listenansicht an.

Das ist mein JSONResponse:

{"news":[{"data":{"id":"1","title":"Big data is changing the ace f fashion","description":"Download Fashioning Data: A 2015 Update"}}]}