如何使用 Retrofit Android 解析对象内部的数组

Posted

技术标签:

【中文标题】如何使用 Retrofit Android 解析对象内部的数组【英文标题】:How to Parse Array inside Object With Retrofit Android 【发布时间】:2019-02-08 09:02:41 【问题描述】:

我是Retrofit Library 的新手,我曾经使用 Volley 我正在尝试解析对象内部的数组,但我不知道该怎么做 这是我的 Json 回复

  
        "response": 
            "code": "1",
            "success": true,
            "customers": [
                
                    "id": 1,
                    "name": "reem",
                    "customer_type": "1",
                    "address": "45سسسس",
                    "mobile_no": "05684412211",
                    "phone_no": "414511555",
                    "created_at": "2018-07-30 08:26:48",
                    "updated_at": "2018-07-30 08:26:48"
                
            ]
        
    

我想从响应响应中获取客户数组 这是客户模型:

public class Customer 

    @SerializedName("id")
    private Integer id;
    @SerializedName("customer_type")
    private Integer customer_type;
    @SerializedName("name")
    private String name;
    @SerializedName("address")
    private String address;
    @SerializedName("mobile_no")
    private String mobile_no;
    @SerializedName("phone_no")
    private String phone_no;

    public Customer(Integer id, Integer customer_type, String name, String address, String mobile_no, String phone_no) 
        this.id = id;
        this.customer_type = customer_type;
        this.name = name;
        this.address = address;
        this.mobile_no = mobile_no;
        this.phone_no = phone_no;
    

    public Integer getId() 
        return id;
    

    public void setId(Integer id) 
        this.id = id;
    

    public Integer getCustomer_type() 
        return customer_type;
    

    public void setCustomer_type(Integer customer_type) 
        this.customer_type = customer_type;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getAddress() 
        return address;
    

    public void setAddress(String address) 
        this.address = address;
    

    public String getMobile_no() 
        return mobile_no;
    

    public void setMobile_no(String mobile_no) 
        this.mobile_no = mobile_no;
    

    public String getPhone_no() 
        return phone_no;
    

    public void setPhone_no(String phone_no) 
        this.phone_no = phone_no;
    

这里是数据服务接口:

@GET("get_customers")
    Call<List<Customer>> getAllCustomer();

你能帮我理解如何解析它吗?谢谢。

【问题讨论】:

【参考方案1】:

创建另一个 POJO 类,它将具有这样的列表

public class Response

    @SerializedName("response")
    private Response response;

    @SerializedName("code")
    private String code;

    @SerializedName("success")
    private boolean success;

    @SerializedName("customers")
    private List<Customers> customers;

    public void setResponse(Response response)
        this.response = response;
    

    public Response getResponse()
        return response;
    

    public void setCode(String code)
        this.code = code;
    

    public String getCode()
        return code;
    

    public void setSuccess(boolean success)
        this.success = success;
    

    public boolean isSuccess()
        return success;
    

    public void setCustomers(List<Customers> customers)
        this.customers = customers;
    

    public List<Customers> getCustomers()
        return customers;
    

然后在您的数据服务接口中

@GET("get_customers")
Call<Response> getAllCustomer();

然后你可以在从改造电话中得到身体后得到这样的客户列表

reponse.getCustomers();

【讨论】:

如何制作POJO? android Studio 有这个插件 github.com/robohorse/RoboPOJOGenerator 在 Android Studio 中搜索 RoboPOJOGenerator 并安装/重启,然后将你的 json 粘贴到那里,它会自动为你创建类,或者你可以使用 jsonschema2pojo.org 站点还有 jsonschema2pojo.org ..target: java..Source type:json...Annotation style:GSON...并检查那些 Use double numbers..Include getter and setter....允许附加属性 ...粘贴您的回复 ....然后单击预览...@ReemAziz 是的,或者您可以下载 zip,然后将其解压缩到项目的包位置,而不是预览,或者更好的是下载 Android Studio 插件【参考方案2】:

正确,api应该只返回客户json列表

或者你应该更新你的回应

    public class Customer

    public int id  get; set; 
    public string name  get; set; 
    public string customer_type  get; set; 
    public string address  get; set; 
    public string mobile_no  get; set; 
    public string phone_no  get; set; 
    public string created_at  get; set; 
    public string updated_at  get; set; 


public class Response

    public string code  get; set; 
    public bool success  get; set; 
    public List<Customer> customers  get; set; 


public class RootObject

    public Response response  get; set; 


    @GET("get_customers")
Call<RootObject> getAllCustomer();

【讨论】:

【参考方案3】:

当我们解析对象时,我们需要从 Json 的顶部开始。

所以首先你需要得到“响应”键,然后是内部对象:客户的数组。

为此添加 1 个名为 CustomersData.java 的类,其中包括 Response.java 对象、Response.java 客户容器数组:

CustomersData.java:

public class CustomersData 
    @SerializedName("response")
    public Response response;

Response.java

public class Response 

        @SerializedName("code")
        public String code;

        @SerializedName("success")
        public boolean customers;

        @SerializedName("customers")
        public ArrayList<Customer> customers;
    

要使用 Retrofit 获取数据,可以这样调用:

@GET("get_customers")
    Call< CustomersData > getAllCustomer();

访问它使用:

ArrayList <Customer> array = customersData.response.customers;

【讨论】:

【参考方案4】:

使用这个website 来创建你的模型/pojo 类。稍后重命名它们。 不要忘记在你的 pojo 类中添加@SeralizedName("name_like_your_json") 下面的代码。 (对于您要访问的每个变量)

@SerializedName("id")
private Integer id 

您的模型类将如下所示。

public class Customer 

private Integer id;
private String name;
private String customerType;
private String address;
private String mobileNo;
private String phoneNo;
private String createdAt;
private String updatedAt;

public Integer getId() 
    return id;


public void setId(Integer id) 
    this.id = id;


public String getName() 
    return name;


public void setName(String name) 
    this.name = name;


public String getCustomerType() 
    return customerType;


public void setCustomerType(String customerType) 
    this.customerType = customerType;


public String getAddress() 
    return address;


public void setAddress(String address) 
    this.address = address;


public String getMobileNo() 
    return mobileNo;


public void setMobileNo(String mobileNo) 
    this.mobileNo = mobileNo;


public String getPhoneNo() 
    return phoneNo;


public void setPhoneNo(String phoneNo) 
    this.phoneNo = phoneNo;


public String getCreatedAt() 
    return createdAt;


public void setCreatedAt(String createdAt) 
    this.createdAt = createdAt;


public String getUpdatedAt() 
    return updatedAt;


public void setUpdatedAt(String updatedAt) 
    this.updatedAt = updatedAt;


public class Example 

private Response response;

public Response getResponse() 
    return response;


public void setResponse(Response response) 
    this.response = response;



public class Response 

private String code;
private Boolean success;
private List<Customer> customers = null;

public String getCode() 
    return code;


public void setCode(String code) 
    this.code = code;


public Boolean getSuccess() 
    return success;


public void setSuccess(Boolean success) 
    this.success = success;


public List<Customer> getCustomers() 
    return customers;


public void setCustomers(List<Customer> customers) 
    this.customers = customers;

在你的界面中使用这个。

@GET("get_customers")
Call<Example> getAllCustomer();

看上面的代码。您的 json 响应以 Json Object 开头。所以我们的调用必须是对象。在这种情况下,我们的对象是 Example 类。在此内部另一个对象称为 Response。在那个班级我们的设计

【讨论】:

以上是关于如何使用 Retrofit Android 解析对象内部的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Retrofit 解析 json

Android Retrofit - 如何解析 Github Emojis API

Android 网络框架之Retrofit2使用详解及从源码中解析原理

android之Retrofit使用

Android – 使用带有 Jetpack Compose 的 Retrofit 库进行 JSON 解析

Android – 使用带有 Jetpack Compose 的 Retrofit 库进行 JSON 解析