2016-08-17 5 views
0

Все.Null Object In Retrofit2

Я пытаюсь подключиться к RestApi с помощью retrofit2, но это когда-либо дает мне ошибку или возвращает объект null.

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

У меня есть следующий код:

Интерфейс отдыха

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

POJO объект:

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 
    } 

} 

И шоу в 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 "); 

     } 

    }); 

Но это когда-либо возвращает null.

ответ

2

Пожалуйста сделайте followin g изменений в вашем классе, надеюсь, это должно сработать. Дайте мне знать, если это не так.

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

У вас есть две «новости», «новости» внутри вашей строки json.

Поскольку ваша модель аннотированный со следующим

N овости (массив)

-> идентификатор

-> Заголовок

-> Описание

{ 
    "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" } 
    ] 
} 

Но в вашей строке json

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

Вы можете увидеть структуру:

новости (массив)

-> Новости (объекты)

-> идентификатор

-> название

- > описание

Следовательно, вы не можете фазировать в нем какие-либо данные.

выше причина вы получаете нулевой объект, и вы должны использовать первую структуру JSON, чтобы получить новости данные

Ниже приводится предложение для работы

  1. Dont путать с слова «новости» и структуры данных «Новости» (http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api) Это нормально для вас, чтобы использовать «новости» в качестве пути для получения списка новостей. Но будет больно, если у вас будет другая «новость» или «список» в возвращении json, так как это довольно запутанно, чтобы узнать, какой должна быть новость. Попробуйте другое слово, например «данные», «предметы» или просто верните arraylist из новостей с вашего пути (http://restful.com/news) уведомили, что вы пытаетесь достать список новостей

  2. Создайте тестовый пример для вашего спокойствия.Это будет болезненно, если вы попытаетесь протестировать все успокоительные api в своем мобильном приложении. Попробуйте использовать следующие

    A. Построить тест инструмента (https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html) для вас демо кнопку нажмите, чтобы вызвать успокоительный

    B. Мок запрос с использованием переоснащения (https://github.com/square/okhttp/tree/master/mockwebserver) и скопировать строку JSON в экранированием символов один (с помощью этого сайта http://bernhardhaeussner.de/odd/json-escape/)

Эти два способа позволит сэкономить много времени в развитии

0

Это сработало для меня. Я не знаю, почему вы взяли статический класс. Я сделал это просто так:

POJO класс 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 Интерфейс:

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(); 
        } 
       } 

Здесь loltry.php на моем localhost отправляет объект json, который вы пытаетесь проанализировать. И я показываю заголовок в вашем объекте «Новости» (мой «данные») в списке.

Это мой JSONResponse:

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