Retrofit 2.0如何parsing嵌套的JSON对象?

我们的团队决定使用Retrofit 2.0 ,我正在对这个库进行一些初步的研究。 正如标题所述,我想通过我们的Android应用程序中的Retrofit 2.0来parsing一些嵌套的JSON对象。

例如, 这里是一个嵌套的JSON对象,格式为:

{ "title": "Recent Uploads tagged android", "link": "https://www.flickr.com/photos/tags/android/", "description": "", "modified": "2015-10-05T05:30:01Z", "generator": "https://www.flickr.com/", "items": [ { "title": ... "link": ... "media": {"m":"This is the value I want to get:)"} "description": ... "published": ... "author": ... "author_id": ... "tags": ... }, {...}, ... ] } 

我对items数组中的JSON对象感兴趣。 我注意到有一些关于通过Retrofit 1.Xparsing嵌套的JSON对象的post ,但是最新的Retrofit 2.0 API已经改变了很多,当将它们适配到新的API时,这是令人困惑的。

我想到两个可能的解决scheme:

  1. 编写我自己的扩展Converter.Factory的JSON转换工厂。
  2. 以Stringtypes返回原始响应,并自行parsing。 但根据我的初步研究,从Retrofit 2.0获得原始响应并不容易。 Retrofit 2.0似乎坚持在将响应转换为某种东西之前将其传递给我,并且Retrofit不提供它自己的StringConverter 。 (我可能是错的〜)

更新:通过将JSONElement设置为HTTP API接口的pojo,并使用Retrofit提供的GSONConverter作为转换器,我们实际上可以获得原始响应。

如果有人能就这个问题分享一些想法,那将是非常好的。

谢谢:)

Solutions Collecting From Web of "Retrofit 2.0如何parsing嵌套的JSON对象?"

假设你的完整的JSON看起来像

 { "title": "Recent Uploads tagged android", "link": "https://www.flickr.com/photos/tags/android/", "description": "", "modified": "2015-10-05T05:30:01Z", "generator": "https://www.flickr.com/", "items": [ { "member1": "memeber value", "member2": "member value" }, { "member1": "memeber value", "member2": "member value" } ] } 

所以Pojo类将是

 public class MainPojo { private String title; private String description; private String link; private String generator; private String modified; private ArrayList<Items> items; // Getters setters } public class Items { private String member2; private String member1; // Getters setters } 

注意:这是为您的JSON类似的解决scheme。 如果JSON具有其他键,则可以更改Items.java的成员。


将Pojo更新为新的JSON

 public class Items { private String tags; private String author; private String title; private String description; private String link; private String author_id; private String published; private Media media; // Getters and Setters } public class Media { private String m; // Getters and Setters } 

以下代码将有助于获得嵌套的json对象和数组

例如:json

 { "similar_product":[ { ..... } ], "options":{ "Blouse Length":[ { "value_id":"696556", } 

首先我们需要创build模型类,模型类的项目名称在json项目中是相同的,我们可以使用@SerializedName("for exact json name")

 public class Product { public Options options; public void setOptions(Options options) { this.options = options; } public Options getOptions() { return options; } // length... public class Options { @SerializedName("Blouse Length") private ArrayList<BlouseLength> blouseLengths; public void setBlouseLengths(ArrayList<BlouseLength> blouseLengths) { this.blouseLengths = blouseLengths; } public ArrayList<BlouseLength> getBlouseLengths() { return blouseLengths; } } public class BlouseLength { String value_id; public void setValue_id(String value_id) { this.value_id = value_id; } public String getValue_id() { return value_id; } } } 

创build接口的改造,以获得JSON项目在URL中

 // don't need to put values of id in retrofit ex:: "/api-mobile_.php?method=getProductById&pid=" 

只需在查询中传递url参数就可以自动获取url

例如:

 public interface Retrofit_Api { @FormUrlEncoded @GET("/api-mobile_.php?method=getProductById") Call<Product> responseproduct(@Query("pid") String pid); } 

在你的主类

  String pid=editid.getText().toString(); final Retrofit adapter = new Retrofit.Builder() .baseUrl(Product_url) .addConverterFactory(GsonConverterFactory.create()) .build(); //Creating an object of our api interface Retrofit_Api api = adapter.create(Retrofit_Api.class); Call<Product> call = api.responseproduct(pid); call.enqueue(new Callback<Product>() { @Override public void onResponse(Call<Product> call, Response<Product> response) { ArrayList<Product.BlouseLength> p= new ArrayList(response.body().getOptions().getBlouseLengths()); Editadapter editadapter=new Editadapter(MainActivity.this,p); recyclerView.setAdapter(editadapter); } @Override public void onFailure(Call<Product> call, Throwable t) { Log.d("Error", t.getMessage()); } }); } 

使用Gson轻松parsing您的模型https://github.com/google/gson

我的帮手方法:

 public String toJson(Object object) { return gson.toJson(object); } public <T> T fromJson(String json, Class<T> classOfT) { return gson.fromJson(json, classOfT); } public <T> T fromJson(JsonElement jsonElement, Class<T> classOfT) { return gson.fromJson(jsonElement, classOfT); } 

你有没有尝试凌空? …我更喜欢现在这是一个谷歌产品翻新。我有工作的例子,如果你不介意,我可以告诉你。 http://www.androidhive.info/2014/09/android-json-parsing-using-volley/

萨拉姆。 我忘了添加@SerializedName@Expose注释内部类对象和添加这些注释问题解决。 喜欢这个:

JSON:

 {"Id": 1,} 

和class级成员:

 @SerializedName("Id") @Expose private int id;