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

它显示“成功”和“状态”的值,但 arraylist 显示名称和 end_time 为空

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"您的类模型中的任何地方都没有包含一个字符串。


所以你基本上有两个选择:

1.-您可以创建另一个类,比如说EventItem,只有一个字段:

Event event;

并更改您的FeaturedPageData课程:

ArrayList<EventItem> events;


2.-你可以使用 aMap而不是 a List,这样在你的FeaturedPageData课堂上你应该有:

Map<String, Event> events;

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

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

于 2013-05-22T13:28:36.860 回答
1

我认为这是因为您实际上并没有解析 Event 对象数组,而是解析一个对象数组,其中包含一个名为“event”的字段,该字段指向 Event 对象。

"events": [
    {
        "event": {

您还没有为这个容器对象声明一个类,所以它不会被解析。

为外部对象创建一个类,或修改您的 json-array 使其直接包含 Event 对象。

于 2013-05-22T12:54:25.750 回答
0

下次您可以使用http://www.jsonschema2pojo.org/对我来说解决此类问题的最佳工具 :) 将 ArrayList 更改为 List

于 2017-10-23T14:05:26.593 回答