2017-11-22 16 views
0

私はnewsapiを消費していますが、そのJSON応答はこれに似ています。Retrofit 2でネストされたオブジェクトを解析するにはどうすればよいですか?

{ 
"status": "ok", 
"articles": [ 
    { 
     "source": { 
      "id": "bbc-news", 
      "name": "BBC News" 
     }, 
     "author": "BBC News", 
     "title": "Jubilation greets end of Mugabe era", 
     "description": "Zimbabweans celebrate late into the night after Robert Mugabe resigns, ending 37-year rule.", 
     "url": "http://www.bbc.co.uk/news/world-africa-42072673", 
     "urlToImage": "https://ichef.bbci.co.uk/images/ic/1024x576/p05nt3bn.jpg", 
     "publishedAt": "2017-11-22T02:46:09Z" 
    }, 
    { 
     "source": { 
      "id": "bbc-news", 
      "name": "BBC News" 
     }, 
     "author": "BBC News", 
     "title": "Dramatic moment N Korea soldier defects", 
     "description": "He raced across the border on foot, closely pursued by North Korean troops who shot at him several times.", 
     "url": "http://www.bbc.co.uk/news/world-asia-42075986", 
     "urlToImage": "https://ichef.bbci.co.uk/news/1024/cpsprodpb/F519/production/_98854726_p05ntph4.jpg", 
     "publishedAt": "2017-11-22T04:45:14Z" 
    }, 
    { 
     .... 
    } 
    ] 
} 

私はGSONでRetrofit 2を使用してその応答を消費しようとしています。

マイPOJOクラスは次のとおりです。

NewsList.java

public class NewsList { 
    public Articles[] articles; 
    private String status; 

    @Override 
    public String toString() { 
    return "ClassPojo [articles = " + articles + ", status = " + status + "]"; 
    } 

    // getters and setters 
} 

Articles.java

public class Articles { 
    private String publishedAt; 
    private String author; 
    private String urlToImage; 
    private String title; 
    private Source source; 
    private String description; 
    private String url; 

// getters and setters 
} 

Source.java

public class Source { 
    private String id; 
    private String name; 

    // getters and setters 
} 

マイレトロフィットのCl ientはこのように見える。私はこのようなレトロフィットクライアントへの呼び出しを行う私のMainActivity.java

public interface NewsroomAPI { 
    String BASE_URL = "https://newsapi.org/v2/"; 

    @GET("top-headlines") 
    Call<NewsList> loadNews(@Query("sources") String source); 

} 

OkHttpClient okHttpClient = new OkHttpClient().newBuilder().addInterceptor(new Interceptor() { 
    @Override public okhttp3.Response intercept(Chain chain) throws IOException { 
     Request originalRequest = chain.request(); 
     Request.Builder builder = originalRequest.newBuilder().header("Authorization", 
       getString(R.string.newsroom_api_key)); 
     Request newRequest = builder.build(); 
     return chain.proceed(newRequest); 
    } 
}).build(); 

Retrofit.Builder builder = 
      new Retrofit.Builder() 
        .baseUrl(NewsroomAPI.BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create()); 

    Retrofit retrofit = builder.client(okHttpClient).build(); 
    NewsroomAPI getNewsAPI = retrofit.create(NewsroomAPI.class); 

    Call<NewsList> call = getNewsAPI.loadNews("bbc-news"); 
    call.enqueue(new Callback<NewsList>() { 
     @Override public void onResponse(Call<NewsList> call, Response<NewsList> response) { 
      if (response.isSuccessful()) { 
       NewsList newslist = response.body(); 
       Log.w(TAG, "Articles result: " + newslist); 
      } else { 
       Toast.makeText(getContext(), "Some error occurred while fetching results!", 
         Toast.LENGTH_SHORT).show(); 
      } 
     } 

     @Override public void onFailure(Call<NewsList> call, Throwable t) { 
      Log.w(TAG, "Failed! ", t); 
     } 
    }); 

問題は、アクティビティを実行して結果を記録するときに発生します。 statusと返されたarticlesのログが必要です。ただし、ステータスは正常に返されますが、articlesオブジェクトはnullです。出力は次のようになります。

W/GlobalNewsFragment: Articles result: ClassPojo [articles = null, status = ok] 

問題はRetrofit2が返されたJSONオブジェクトを直列化復元されている方法から来ているようです。私が間違っていることは何ですか?

これらは私のbuild.gradleファイルに依存関係

あなたのPOJOクラスは以下のようにする必要があり
compile 'com.squareup.retrofit2:retrofit:2.3.0' 
compile 'com.squareup.retrofit2:converter-gson:2.3.0' 
compile "com.android.support:recyclerview-v7:26.1.0" 
compile "com.squareup.okhttp3:okhttp:3.8.0" 
+0

私の更新された答えをチェックしてください。 –

答えて

0

です。

public class Article { 

@SerializedName("source") 
@Expose 
private Source source; 
@SerializedName("author") 
@Expose 
private String author; 
@SerializedName("title") 
@Expose 
private String title; 
@SerializedName("description") 
@Expose 
private String description; 
@SerializedName("url") 
@Expose 
private String url; 
@SerializedName("urlToImage") 
@Expose 
private String urlToImage; 
@SerializedName("publishedAt") 
@Expose 
private String publishedAt; 
// your getter setter methods 
} 

NewsList POJOは以下のようになります。

public class NewsList { 

@SerializedName("status") 
@Expose 
private String status; 
@SerializedName("articles") 
@Expose 
private List<Article> articles = null; 
// getter setter 
} 

あなたのsource POJOは以下のようになります。

public class Source { 

@SerializedName("id") 
@Expose 
private String id; 
@SerializedName("name") 
@Expose 
private String name; 
// getters setters 
} 
+0

私はあなたの解決策に従ってきましたが、私はまだ同じ結果を得ています。 'W/GlobalNewsFragment:記事の結果:ClassPojo [articles = null、status = ok]' articlesオブジェクトはまだ空です。 – Johnz

+0

あなたの 'NewsList' pojoが正確である(' articles'のgetter setterメソッドをチェックする)ことができないと思います。状態は 'ok'を返すからです。 –

+0

私のレポへのリンクはhttps://github.com/SerryJohns/Newsfeed/tree/global-newsです – Johnz

0

私の知る限りGsonはListJsonArrayをデシリアライズ。試してみてください:

public class NewsList { 
    public List<Articles> articles; 
    private String status; 

    //some code 
} 
関連する問題