web-dev-qa-db-ja.com

JSON配列を取得し、gsonを使用して各jsonオブジェクトを解析する方法は? (後付け)

私は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;
        }
}
23
Lion789

コールバックでcustomObjectのリストを呼び出すだけで、仕事をしました...

new Callback<List<ObjResponse>>() {
34
Lion789

私はもともと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<Person>の形式でCall<List<Person>>に変換します]

最後に、最初の非同期要求呼び出しを行うときに、コールバックをそのように変換する必要があります。

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

これが上記の受け入れられた答えから失われた他の人を助けることを願っています。

10
coletrain

これは、応答オブジェクトの配列を渡すだけでも機能します。これが応答オブジェクトの場合:

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) {

    }
};

OR

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

簡単に言うと、通常Tを応答クラスで置き換えるすべての場所で、CustomUserResponse[]のように配列で置き換えます。


注:混乱を招くエラーを避けるため、Retrofitインターフェイス定義でも配列を使用してください:

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

このようなものを試すことができます

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

これは間違いなく機能するはずです。

2
VikramV