0

我的文件名中有一个 json:test.json

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

这是我的豆类

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

我只能打印第一行,如果我必须解析其他行,我该怎么办?

4

3 回答 3

0

正如评论所说,它不是有效的 json 字符串(您可以使用jsonlint来验证 json)。

如果 book 元素在每本书后面带有逗号的列表中,那么您应该将其转换为 Books 列表,而不仅仅是使用 books 类。为此,您必须使用泛型类型 token

在这种情况下,它看起来有点像这样:

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

(也许您的班级名称应该是 Book 而不是 Books?-因为每个“Books”表示一本书)

于 2012-07-28T05:54:29.453 回答
0

我假设您有以下 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());
}
于 2012-07-28T05:57:01.530 回答
0

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}]}

如果是这样,您可以使用 Gson 解析整个文件,给定您的Books类,如下所示:

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());
}
于 2012-07-28T05:58:47.657 回答