2

ここに私が解析したいjsonがあります

{

"success": true,
"status": 200,
"events": [
    {
        "event": {
            "artist_id": 54,
            "created_at": "2013-04-05T08:52:40Z",
            "duration": 2,
            "end_time": "2013-06-06T22:30:00Z",
            "event_desc": "Singer, composer, lyrist and Asia’s much lauded star, Jay Chou, will cast his spell on us once again on 6, 7 & 8 June at the Singapore Indoor Stadium at 8pm.\r\nHis most recent album “Opus 12” - the name symbolizing his 12th Mandarin album has been widely received and he now follows up with his eagerly anticipated world tour “OPUS JAY 2013 WORLD TOUR” which lets fans see Jay Chou’s\r\naccumulation of hard work since his first album in 2000.\r\nJay Chou rules with his trademark “Chou Style” known for his unusual brand of cross-genre pop, mixing Chinese and Western R & B beats sealing his status as the King of Mandopop.\r\n12 years on, Jay Chou still has plenty to give through his songs which cover a variety of genres and themes. Loyal fans can dance to Jay’s signature raps as well croon along with him though his soulful ballads.\r\nThis concert promises to be a spectacular experience from start to finish. Singapore is also Jay Chou’s third concert stop after Beijing and Shanghai and we get to experience this exciting and moving stage performance earlier in the tour!\r\nMark your calendars for a spectacular concert weekend and let the countdown begin!",
            "event_facebook_link": "http://www.facebook.com/events/490248764356139",
            "event_link": "http://www.sistic.com.sg/portal/dt?dt.isPortletRequest=true&dt.action=process&dt.provider=PortletWindowProcessChannel&dt.windowProvider.targetPortletChannel=JSPTabContainer/sEventsCalendar/Event&dt.containerName=JSPTabContainer/sEventsCalendar&dt.windowPr",
            "feature_small": false,
            "featured_status": true,
            "id": 51,
            "image": {
                "url": "/uploads/event/image/51/Event.jpg",
                "ratina_big": {
                    "url": "/uploads/event/image/51/ratina_big_Event.jpg"
                },
                "ratina_small": {
                    "url": "/uploads/event/image/51/ratina_small_Event.jpg"
                },
                "thumb_big": {
                    "url": "/uploads/event/image/51/thumb_big_Event.jpg"
                },
                "thumb_small": {
                    "url": "/uploads/event/image/51/thumb_small_Event.jpg"
                },
                "cell_big": {
                    "url": "/uploads/event/image/51/cell_big_Event.jpg"
                },
                "cell_small": {
                    "url": "/uploads/event/image/51/cell_small_Event.jpg"
                }
            }

解析用に定義されたクラスは以下のとおりです

public class FeaturedPageData {

@SerializedName("status")
public String status;

@SerializedName("success")
public String success;

@SerializedName("events")
public ArrayList<Event> events = new ArrayList<FeaturedPageData.Event>();

public static class Event {

    public Event() {

    }

    @SerializedName("name")
    public String name;

    @SerializedName("end_time")
    public String end_time;

    public Images images;
}

public static class Images {

    public String ratina_big;
    public String ratina_small;
}

}

解析するために Json を呼び出している関数

Reader reader = new InputStreamReader(content);
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
FeaturedPageData posts = new FeaturedPageData();
posts = gson.fromJson(reader, FeaturedPageData.class);
content.close();
handlePostsList(posts);

"success" と "status" の値が表示されますが、arraylist には name と end_time の null が表示されます

4

3 に答える 3

5

他の回答ですでに指摘されているように、問題は"events"JSON 要素を の配列として解析しようとしてEventいるため、Gson は次のようなものを期待しています。

"events": [
    {
        "artist_id": 54,
        "created_at": "2013-04-05T08:52:40Z",
        "duration": 2,
        ...
    },
    ...
]

しかし、実際には次のものがあります。

"events": [
    {
        "event": {
            "artist_id": 54,
            "created_at": "2013-04-05T08:52:40Z",
            "duration": 2,
            ...
        }
    },
    ...
]

"event"クラス モデルのどこにも含まれていない文字列があることに注意してください。


したがって、基本的に2つのオプションがあります。

1.-EventItemフィールドが 1 つだけの別のクラスを作成できます。

Event event;

FeaturedPageDataクラスを次のように変更します。

ArrayList<EventItem> events;


2.-Map a の代わりに aを使用できるため、ListクラスFeaturedPageDataには次のものが必要です。

Map<String, Event> events;

"events"このようにして、配列の内容がstring ( "event") と objectのペアの数であることを Gson に伝えていますEvent。これはまさに JSON 応答にあるものです...

この2番目のソリューションの方がはるかに優れていると思います!

于 2013-05-22T13:28:36.860 に答える
1

これは、実際には Event オブジェクトの配列を解析しているのではなく、Event オブジェクトを指す「event」という名前の単一のフィールドを含むオブジェクトの配列を解析しているためだと思います。

"events": [
    {
        "event": {

このコンテナ オブジェクトのクラスを宣言していないため、解析されません。

外側のオブジェクトのクラスを作成するか、json-array を変更して Event オブジェクトが直接含まれるようにします。

于 2013-05-22T12:54:25.750 に答える