2

サードパーティのRESTfulWebサービスから次のJSONを取得するJavaアプリがあります。

{
    "widgets":[
        [
            {
                "id":25128,
                "status":"always",
                "uuid":"96f62edd-fa8a-4267-8ffb-14af0d37de26"
            }
        ],
        [
            {
                "id":25200,
                "status":"always",
                "uuid":"78553c9e-398f-495a-8fb8-ada0fb297844"
            }
        ],
        [
            {
                "id":25128,
                "status":"never",
                "uuid":"b1e3deb2-a842-4cba-8272-458d15efb394"
            }
        ]
    ]
}

List<Widget>そしてそれを使用するGSONに変換しようとしています:

public class Widget {
    @SerializedName("id")
    private Long id;

    @SerializedName("status")
    private String status;

    @SerializedName("uuid")
    private String uuid;

    // Getters & setters, etc.
}

これが私のマッパーコードです:

String jsonResponse = getJsonFromWebService();
Gson gson = new Gson();
List<Widget> widgets = gson.fromJson(jsonResponse, new TypeToken<List<Widget>>(){}.getType());

これを実行すると、次のエラーが発生します。

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2
java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2

明らかに、GSONマッパーコードに送信する前にJSON文字列を操作するか、「予期しない」JSONを処理するようにGSONを構成する必要がありますが、どちらがより簡単で適切かはわかりません。JSON文字列を「マッサージ」する必要がある場合、GSONをうまく機能させるために何をする必要があるかわかりません。また、GSONを構成する必要がある場合は、そこで何をすべきかわからない。何か案は?前もって感謝します。

4

2 に答える 2

1

問題は、単一の JSON プロパティ「ウィジェット」を持つルート JSON オブジェクトを無視していることです。代わりに、データをこのオブジェクトに逆シリアル化してみてください。

public class WidgetList {
    @SerializedName("widgets")
    private List<List<Widget>> widgets;
}
于 2013-02-28T14:26:23.623 に答える
0

以下の形式にマッサージするとうまくいきます

[
    {
       'id':25128,
       'status':'always',
       'uuid':'96f62edd-fa8a-4267-8ffb-14af0d37de26'                                                           },       
    {
        'id':25200,
        'status':'always',
        'uuid':'78553c9e-398f-495a-8fb8-ada0fb297844'                                           },
    {   'id':25128,
        'status':'never',
        'uuid':'b1e3deb2-a842-4cba-8272-458d15efb394'   
}
]

以下に示すように

public class TryMe {

    public static void main(String[] args) {

    Gson gson = new Gson();
        List<Widget> widgets = gson.fromJson(json,
                new TypeToken<List<Widget>>() {
                }.getType());

        System.out.println(widgets);
    }
}

class Widget {
    @SerializedName("id")
    private Long id;

    @SerializedName("status")
    private String status;

    @SerializedName("uuid")
    private String uuid;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    @Override
    public String toString() {
        return "Widget [id=" + id + ", status=" + status + ", uuid=" + uuid
                + "]";
    }   
}

以下の応答を与える

[Widget [id=25128, status=always, uuid=96f62edd-fa8a-4267-8ffb-14af0d37de26], Widget [id=25200, status=always, uuid=78553c9e-398f-495a-8fb8-ada0fb297844], Widget [id=25128, status=never, uuid=b1e3deb2-a842-4cba-8272-458d15efb394]]
于 2013-02-28T15:01:21.840 に答える