用Gson解析,嵌套数组列表中为null

Has*_*oid 2 java parsing android json gson

这是我要解析的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"
                }
            }
Run Code Online (Sandbox Code Playgroud)

为解析定义的类如下

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;
}
Run Code Online (Sandbox Code Playgroud)

}

我正在调用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);
Run Code Online (Sandbox Code Playgroud)

它显示“成功”和“状态”的值,但arraylist显示name和end_time为null

Mik*_*ikO 5

正如在其他答案中已经指出的那样,问题在于您正试图将"events"JSON元素解析为的数组Event,因此Gson期望如下所示:

"events": [
    {
        "artist_id": 54,
        "created_at": "2013-04-05T08:52:40Z",
        "duration": 2,
        ...
    },
    ...
]
Run Code Online (Sandbox Code Playgroud)

但是您实际上有:

"events": [
    {
        "event": {
            "artist_id": 54,
            "created_at": "2013-04-05T08:52:40Z",
            "duration": 2,
            ...
        }
    },
    ...
]
Run Code Online (Sandbox Code Playgroud)

请注意,"event"类模型中的任何地方都没有包含一个字符串。


因此,您基本上有2个选择:

1.-您可以EventItem仅使用一个字段来创建另一个类,比如说:

Event event;
Run Code Online (Sandbox Code Playgroud)

并更改您的FeaturedPageData课程:

ArrayList<EventItem> events;
Run Code Online (Sandbox Code Playgroud)


2.-您可以使用a Map而不是a List,以便在您的FeaturedPageData课堂上应该有:

Map<String, Event> events;
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您告诉Gson数组的内容"events"是成对的:字符串("event")和一个对象Event,这正是您在JSON响应中所拥有的...

我认为第二种解决方案要好得多!