Java 如何抓取JSON数组并使用gson解析每个json对象?(改造)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22469284/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 15:55:49  来源:igfitidea点击:

How to grab JSON Array and use gson to parse each json object? (Retrofit)

javaandroidjsongsonretrofit

提问by Lion789

I am returning an array of results with my json Objects, and I am trying to use my customObjectResponse class to pull out each of the fields within each of the objects... the problem it is expecting an object so how do I edit my class to allow it to take in an array of object to be able to then call the fields of each object... I am confused as to what needs to be added:

我正在使用我的 json 对象返回一组结果,并且我正在尝试使用我的 customObjectResponse 类来提取每个对象中的每个字段......它期待一个对象的问题所以我如何编辑我的类允许它接收一个对象数组以便能够调用每个对象的字段......我对需要添加的内容感到困惑:

Here is a response example of what is being passed to be used:

以下是正在传递的内容的响应示例:

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

  }
]

Here is my response Object Class:

这是我的响应对象类:

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;
    }

}

what I am trying, but is not working, even if I separate the classes into their own files:

我正在尝试但不起作用,即使我将类分成自己的文件:

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;
        }
}

采纳答案by Lion789

I ended up just calling in the callback a list of the customObject and it did the job...

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

new Callback<List<ObjResponse>>() {

回答by VikramV

You could try something like this

你可以试试这样的

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);
}

This should definitely work.

这绝对有效。

回答by gMale

This can also work by just passing an array of response objects. So if this is your response object:

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

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

You can use related syntax, depending on how you use the callbacks. Such as:

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

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

    }

    @Override
    public void failure(RetrofitError error) {

    }
};

OR

或者

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

Put simply, in every place where you normally replace Twith a response class, replace it with an array, instead as in CustomUserResponse[].

简而言之,在通常T用响应类替换的每个地方,用数组替换它,而不是像CustomUserResponse[].



NOTE: to avoid confusing errors, be sure to also use an array in the Retrofitinterface definition:

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

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

回答by coletrain

I originally had trouble getting an idea of how the OPsolved his problem but, after days of debugging I have finally figured out how to solve this issue.

我最初很难OP弄清楚他的问题是如何解决的,但是经过几天的调试,我终于想出了如何解决这个问题。

So you essentially have data in the format like so (JSON Array of JSON Objects):

因此,您基本上拥有这样格式的数据(JSON 对象的 JSON 数组):

[
    {
      ...
    }
] 

Your class that models the data and contains the getter and setter methods are nothing more than your typical POJO.

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

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

    // Getters and Setters....
}

In your interface that contains your RESTful annotations you want to convert your call from:

在包含 RESTful 注释的界面中,您希望将调用转换为:

Before:

前:

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

After:

后:

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

In your android activity you want to convert all calls in the form of Call<Person>to Call<List<Person>>

在您的 android 活动中,您希望将所有调用转换Call<Person>Call<List<Person>>

Finally when making the initial asynchronous request call, you will want to convert your callbacks like so.

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

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) {...}
});

Hope this helps others whom are lost from the accepted answer above.

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