【问题标题】:How to grab JSON Array and use gson to parse each json object? (Retrofit)如何抓取 JSON 数组并使用 gson 解析每个 json 对象? (改造)
【发布时间】:2025-11-25 23:30:02
【问题描述】:

我正在使用我的 json 对象返回一个结果数组,并且我正在尝试使用我的 customObjectResponse 类来提取每个对象中的每个字段......它期望一个对象的问题那么我该怎么做编辑我的类以允许它接收一个对象数组,然后能够调用每个对象的字段...我对需要添加什么感到困惑:

这是一个响应示例,说明正在传递以供使用的内容:

[
  {
    itemId: 'dfsdfsdf343434',
    name: 'tests',
    picture: '6976-7jv8h5.jpg',
    description: 'testy.',
    dateUpdated: 1395101819,

  }
]

这是我的响应对象类:

public class ObjResponse{
    private String itemId;
    private String name;
    private String picture;

    private String description;

    private String location;
    private int dateUpdated;

    private String msg;




    //gridview constructor
    public ObjResponse(String picture) {
        this.picture = picture;
    }

    //public constructor
    public ObjResponse() {

    }

    public String getItemId() {
        return itemId;
    }

    public void setItemId(String itemId) {
        this.itemId = itemId;
    }

    public String getName() {
        return name;
    }

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

    public String getPicture() {
        return picture;
    }

    public void setPicture(String picture) {
        this.picture = picture;
    }


    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }


    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }



    public int getDateUpdated() {
        return dateUpdated;
    }

    public void setDateUpdated(int dateUpdated) {
        this.dateUpdated = dateUpdated;
    }




    public String getMsg() {
        return msg;
    }

}

我正在尝试,但无法正常工作,即使我将这些类分开到它们自己的文件中:

Data passed in:
items: [{obj1: "A", obj2: ["c", "d"]}, {etc...}]


public class Response {

        public class List<Custom> {
                private List<Custom> items;
        }

        public class Custom {
                private String obj1;
                private List<Obj2> obj2;
        }

        public Class Obj2 {
                private String letters;
        }
}

【问题讨论】:

标签: java android json gson retrofit


【解决方案1】:

你可以试试这样的

JSONObject jsonObject = new JSONObject(<your JSON string result>);
JSONArray jsonArray = jsonObject.getJSONArray();

//use GSON to parse
if (jsonArray != null) {
   Gson gson = new Gson();
   ObjResponse[] objResponse = gson.fromJson(jsonArray.toString(), ObjResponse[].class);
   List<ObjResponse> objResponseList = Arrays.asList(objResponse);
}

这肯定行得通。

【讨论】:

  • 就我上面的班级而言,这会去哪里?在我的对象响应类中?
  • 不,这将在您的呼叫活动类中。您进行网络服务调用的课程。我的回复将适用于该网络服务调用的响应。
  • 据我了解,如果我只是构建正确的层次结构,那么 gson 会处理它而无需我做任何花哨的事情...我添加了一个示例代码,说明我认为可能有效但无效...我什至试图将它分成单独的文件
  • 我这样说是因为我正在使用改造来处理我所理解的 gson,我只需要指定正确的类但有问题
  • 这个方案其实更好。如果返回的数据不是直接的对象数组而是 JSON 数组包含在另一个键中,则可以轻松修改。
【解决方案2】:

我最终只是在回调中调用了一个 customObject 列表,它完成了这项工作......

new Callback<List<ObjResponse>>() {

【讨论】:

  • 你能分享一下你是如何使用你的 POJO
  • 我将信息作为我的自定义对象的列表获取,然后对于每个列表项,例如 item[0],我拥有所有自定义对象获取/设置属性...如果不是您指的是什么,请解释一下,以便我提供帮助。
  • Callback 是什么类型的对象?
  • 回调是一个改造函数,我只是添加了单个对象的列表
  • 不需要完整的代码实现。这里重要的部分是,如果你告诉 Retrofit 来解析像 List 这样的服务器响应,这意味着你在顶层的 json 不是 json object {} 而是 json array [] 。
【解决方案3】:

这也可以通过传递一个响应对象数组来实现。因此,如果这是您的响应对象:

public class CustomUserResponse {
    public String firstName;
    public String lastName;
    ...
}

您可以使用相关语法,具体取决于您使用回调的方式。如:

new Callback<CustomUserResponse[]>(){
    @Override
    public void success(CustomUserResponse[] customUserResponses, Response rawResponse) {

    }

    @Override
    public void failure(RetrofitError error) {

    }
};

public class GetUserCommand implements Callback<CustomUserResponse[]> { ...

简单地说,在您通常用响应类替换 T 的每个地方,用数组替换它,而不是像 CustomUserResponse[] 那样。


注意:为避免混淆错误,请务必在 Retrofit 接口定义中使用数组:

@POST ( "/users" )
public void listUsers(@Body GetUsersRequest request, Callback<CustomUserResponse[]> callback);

【讨论】:

  • List 和 Array 有区别吗?
  • 不。哪个更方便您应该可以正常工作。就个人而言,我倾向于在最低级别使用数组,并仅在需要时将它们转换为列表(我发现这种情况有时比我预期的要少)。
【解决方案4】:

我最初不知道OP 是如何解决他的问题的,但是经过几天的调试,我终于想出了如何解决这个问题。

所以你基本上有这样格式的数据(JSON 对象的 JSON 数组):

[
    {
      ...
    }
] 

为数据建模并包含 getter 和 setter 方法的类只不过是典型的 POJO。

public class Person implements Serializable {
    @SerializedName("Exact format of your json field name goes here")
    private String firstName;

    // Getters and Setters....
}

在包含您的 RESTful 注释的界面中,您希望从以下位置转换呼叫:

之前:

public interface APInterface {
    @GET("SOME URL TO YOUR JSON ARRAY")
    Call<Person>(...)
}

之后:

public interface APInterface {
    @GET("SOME URL TO YOUR JSON ARRAY")
    Call<List<Person>>(...)
}

在您的 android 活动中,您希望以 Call&lt;Person&gt; 的形式将所有调用转换为 Call&lt;List&lt;Person&gt;&gt;

最后,在进行初始异步请求调用时,您需要像这样转换回调。

call.enqueue(new Callback<List<Person>>() {
    @Override
    public void onResponse(Call<List<Person>> call, Response<List<Person>> response) {

        if(response.isSuccessful()){
            List<Person> person = response.body();

           // Can iterate through list and grab Getters from POJO
           for(Person p: person){...}


        } else {
            // Error response...
        }

    }

    @Override
    public void onFailure(Call<List<Person>> call, Throwable t) {...}
});

希望这可以帮助那些从上面接受的答案中迷失的人。

【讨论】: