如何使用 GSON 库将 JSONArray 从 JSONObject 解析为 ArrayList<Object>?

How to parse JSONArray to ArrayList<Object> from JSONObject , using GSON lib?

假设这是我的 JSON 结构。

{
"books": [
    {
        "book": {
            "description": "Drama",
            "date_of_released": "02 September 2015",
            "view_node": "read more >"
        }
    },
    {
        "book": {
            "description": "Horror",
            "date_of_released": "02 September 2015",
            "view_node": "read more >"
        }
    }
],
"pager": {
    "pages": 1,
    "page": 0,
    "count": 2,
    "limit": 2
}

}

这是我的书 class。

public class Book {
    String description;
    String date_of_released;
    String view_node;
}

那是寻呼机 class。

public class Pager {
    int pages;
    int page;
    int count;
    int limit;
}

这就是我所做的,因为我认为我需要一个 class 来解析 JSON。 (不确定是否真的需要)

public class BookInfo {
    ArrayList<Book> books;
    Pager pager;
}

执行后完美适用于pager。

但是 ArrayList 的对象的各个字段都是 null,即使大小为 2 为 JSON。为什么?

使用这个

public class BookWrapper {
     Book book;
}

public class BookInfo {
    ArrayList<BookWrapper> books;
    Pager pager;
}

或重新格式化 json

{

    "books": [
        {

                "description": "Drama",
                "date_of_released": "02 September 2015",
                "view_node": "read more >"

        },
        {

                "description": "Horror",
                "date_of_released": "02 September 2015",
                "view_node": "read more >"

        }
    ],
    "pager": {
        "pages": 1,
        "page": 0,
        "count": 2,
        "limit": 2
    }

}

首先你的json是无效的,要检查你的json请去这个linkjsonlint.com and to make POJO classes of your json visit this link http://www.jsonschema2pojo.org/

你的有效json应该是

{
    "books": [
        {
            "book": {
                "description": "Drama",
                "date_of_released": "02 September 2015",
                "view_node": "read more >"
            }
        },
        {
            "book": {
                "description": "Horror",
                "date_of_released": "02 September 2015",
                "view_node": "read more >"
            }
        }
    ],
    "pager": {
        "pages": 1,
        "page": 0,
        "count": 2,
        "limit": 2
    }
}

在此之后它应该可以工作了!!

试试这个 -

InnerBook.java

public class InnerBook {
    private String description;
    private String date_of_released;
    private String view_node;
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getDate_of_released() {
        return date_of_released;
    }
    public void setDate_of_released(String date_of_released) {
        this.date_of_released = date_of_released;
    }
    public String getView_node() {
        return view_node;
    }
    public void setView_node(String view_node) {
        this.view_node = view_node;
    }
    @Override
    public String toString() {
        return "InnerBook [description=" + description + ", date_of_released="
                + date_of_released + ", view_node=" + view_node + "]";
    }
}

Book.java

public class Book {
    private InnerBook book;

    public InnerBook getBook() {
        return book;
    }

    public void setBook(InnerBook book) {
        this.book = book;
    }

    @Override
    public String toString() {
        return "Book [book=" + book + "]";
    }
}

Pager.java

public class Pager {
    private Long pages;
    private Long page;
    private Long count;
    private Long limit;
    public Long getPages() {
        return pages;
    }
    public void setPages(Long pages) {
        this.pages = pages;
    }
    public Long getPage() {
        return page;
    }
    public void setPage(Long page) {
        this.page = page;
    }
    public Long getCount() {
        return count;
    }
    public void setCount(Long count) {
        this.count = count;
    }
    public Long getLimit() {
        return limit;
    }
    public void setLimit(Long limit) {
        this.limit = limit;
    }
    @Override
    public String toString() {
        return "Pager [pages=" + pages + ", page=" + page + ", count=" + count
                + ", limit=" + limit + "]";
    }

}

Holder.java

import java.util.List;

public class Holder {
    private List<Book> books;
    private Pager pager;
    public List<Book> getBooks() {
        return books;
    }
    public void setBooks(List<Book> books) {
        this.books = books;
    }
    public Pager getPager() {
        return pager;
    }
    public void setPager(Pager pager) {
        this.pager = pager;
    }
    @Override
    public String toString() {
        return "Holder [books=" + books + ", pager=" + pager + "]";
    }

}

Main.java

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.testgson.beans.Holder;

public class Main {
    private static Gson gson;

    static {
        gson = new GsonBuilder().create();
    }

    public static void main(String[] args) {
        String j = "{\"books\":[{\"book\":{\"description\":\"Drama\",\"date_of_released\":\"02 September 2015\",\"view_node\":\"read more >\"}},{\"book\":{\"description\":\"Horror\",\"date_of_released\":\"02 September 2015\",\"view_node\":\"read more >\"}}],\"pager\":{\"pages\":1,\"page\":0,\"count\":2,\"limit\":2}}";
        Holder r = gson.fromJson(j, Holder.class);
        System.out.println(r);
    }
}

结果

Holder [books=[Book [book=InnerBook [description=Drama, date_of_released=02 September 2015, view_node=read more >]], Book [book=InnerBook [description=Horror, date_of_released=02 September 2015, view_node=read more >]]], pager=Pager [pages=1, page=0, count=2, limit=2]]