簡體   English   中英

Json通過多個對象解析

[英]Json Parsing through multiple object

我在文件名中有一個json:test.json

{books:{"name":"XXXXX","isbn":98892}}
{books:{"name":"YYYYY","isbn":64728}}
{books:{"name":"ZZZZZ","isbn":19837}}

這是我的bean類

    class Books{
        private String name;
        private int isbn;
//getter and setter methods

我的主要班級

Gson gson = new Gson();
    try {
        BufferedReader br= new BufferedReader(new FileReader("C:\\test.json"));

                Books m = gson.fromJson(br, Books.class);

                System.out.printf("%s",m.getName());
                System.out.printf("\t%d",m.getIsbn());

我只能打印第一行,如果我必須解析其他行,我該怎么辦?

正如評論所說,它不是有效的json字符串(您可以使用jsonlint來驗證json)。

如果將book元素放在每本書后的逗號列表中,則應將其轉換為Books列表,而不僅僅是使用books類。 為此,您必須使用通用類型標記

在這種情況下,它將看起來像這樣:

Type listOfBooksType = new TypeToken<List<Books>>() {}.getType();
List<Books> books = gson.fromJson(json, listOfBooksType);

(也許您的班級名稱應該是Book而不是Books?-每個“ Books”都表示一本書)

我假設您有以下json文本。

[
{books:{"name":"XXXXX","isbn":98892}},
{books:{"name":"YYYYY","isbn":64728}},
{books:{"name":"ZZZZZ","isbn":19837}}
]

您需要創建另一個包含“ books字段的類,

class Book{
  private String name;
  private int isbn; 
  //getter - setter
}
class Books {
    private Book books;
    public Book getBooks() {
        return books;
    }
    public void setBooks(Book books) {
        this.books = books;
    }
}

並解析json:

BufferedReader br = new BufferedReader(new FileReader("C:\\test.json"));

List<Books> books= gson.fromJson(br,new com.google
                                           .gson
                                           .reflect
                                           .TypeToken<List<Books>>(){}.getType());
for(Books book:books)
{
 System.out.println(book.getBooks().getIsbn() 
                        + " " + book.getBooks().getName());
}

您的test.json中的JSON格式錯誤。 gson應該無法原樣解析它。 名稱應為字符串,因此數據應如下所示:

{"books":{"name":"XXXXX","isbn":98892}}
{"books":{"name":"YYYYY","isbn":64728}}
{"books":{"name":"ZZZZZ","isbn":19837}}

但這還是一個奇怪的數據結構。 它是您自己的格式,還是您得到的東西? 似乎好像要成為一個數組,例如:

{"books":[{"name":"XXXXX","isbn":98892},
          {"name":"YYYYY","isbn":64728},
          {"name":"ZZZZZ","isbn":19837}]}

如果是這樣,您可以使用給定的Books類,使用Gson解析整個文件,如下所示:

Books booksArray[];
booksArray = Gson.fromGson(br, Books[].class);

否則,給定問題所在的數據結構-假設books屬性名稱已加引號-您將需要考慮對象的附加級別,例如:

class BooksWrapper
{
    private Books books;

    public Books getBooks()
    {
       return books;
    }
}

您可以在BufferedReader循環瀏覽並收集所有對象,如下所示:

ArrayList<Books> books = new ArrayList<Books>();
BufferedReader br = new BufferedReader(new FileReader("test.json"));
String line;

BooksWrapper wrapper;

while ((line = br.readLine()) != null)
{
   wrapper = gson.fromJson(line, BooksWrapper.class);
   books.add(wrapper.getBooks());
}

for (Books book : books)
{
   System.out.print(book.getName());
   System.out.println("\t" + book.getIsbn());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM