首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Retrofit 2.0如何解析嵌套的JSON对象?

Retrofit 2.0如何解析嵌套的JSON对象?
EN

Stack Overflow用户
提问于 2015-10-05 14:43:24
回答 5查看 41.4K关注 0票数 31

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

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

代码语言:javascript
复制
{
        "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.X中有关于解析嵌套JSON对象的some posts,但是最新的Retrofit 2.0API已经发生了很大的变化,这在使它们适应新的API时令人困惑。

我想到了两种可能的解决方案:

JSON编写了我自己的转换器工厂,它将原始响应扩展为字符串类型,并由我自己解析它。但根据我最初的研究,要从Retrofit 2.0中获得原始的反应并不容易。Retrofit 2.0似乎坚持在将响应传递给我之前将其转换为某些内容,并且Retrofit不提供自己的StringConverter。(我可能错了~)

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-10-05 15:33:24

假设您的完整JSON如下所示

代码语言:javascript
复制
{
  "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类应该是

代码语言:javascript
复制
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的类似解决方案。如果JSON有其他键,则可以更改Items.java的成员。

更新Pojo作为新的JSON

代码语言:javascript
复制
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
}
票数 41
EN

Stack Overflow用户

发布于 2016-08-17 15:33:42

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

例如: json

代码语言:javascript
复制
{  
    "similar_product":[  
        {  .....
}
    ],
    "options":{  
        "Blouse Length":[  
            {  "value_id":"696556",
               }

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

代码语言:javascript
复制
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;
        }
    }

}

创建接口以在url中获取json项

代码语言:javascript
复制
// don't need to put values of id in retrofit 

ex:: "/api-mobile_.php?method=getProductById&pid="

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

例如:

代码语言:javascript
复制
public interface Retrofit_Api {

    @FormUrlEncoded

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


}

在你的主类中

代码语言:javascript
复制
     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());
            }
        });



    }
票数 12
EN

Stack Overflow用户

发布于 2015-10-05 14:47:41

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

我的帮助器方法:

代码语言:javascript
复制
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);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32942661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档