JSON解析通过多个对象
我有一个文件名的JSON:test.jsonJSON解析通过多个对象
{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)。
如果它的书籍元素在每本书后都带有逗号的列表,那么您应该将其转换为书籍列表,而不是仅使用书籍类。要做到这一点,你将不得不使用generic type token。
在这种情况下,它看起来有点像这样:
Type listOfBooksType = new TypeToken<List<Books>>() {}.getType();
List<Books> books = gson.fromJson(json, listOfBooksType);
(?也许你的类名应该是图书,而不是书籍 - 为每个“书”是指一个书)
我相信你有以下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());
}
的JSON在test.json格式不正确。它不应该能够解析它,因为它是。名称应该是字符串,所以数据看起来应该是这样的:
{"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());
}
感谢您的回复。为什么你宣布“书籍m”变量? – labbyfrost 2012-07-28 10:23:14
另外我得到一个空指针异常。我正在检查... – labbyfrost 2012-07-28 10:25:04
'书籍m'未使用,您的问题代码中的一件神器。从答案中删除 – pb2q 2012-07-28 16:04:59
似乎并不有效的JSON字符串。 – adatapost 2012-07-28 05:19:01
这不看起来像一个JSON数组..看看这篇文章的有效JSON数组和解析与Gson http:// *。com/questions/5749125/how-do-i-parse-json-string-that-contains-list-with-gson – maneesh 2012-07-28 05:53:51