2012-07-28 104 views
0

我有一個文件名的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()); 

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

+2

似乎並不有效的JSON字符串。 – adatapost 2012-07-28 05:19:01

+0

這不看起來像一個JSON數組..看看這篇文章的有效JSON數組和解析與Gson http:// stackoverflow。com/questions/5749125/how-do-i-parse-json-string-that-c​​ontains-list-with-gson – maneesh 2012-07-28 05:53:51

回答

0

由於註釋說它不是一個有效的json字符串(您可以使用jsonlint來驗證json)。

如果它的書籍元素在每本書後都帶有逗號的列表,那麼您應該將其轉換爲書籍列表,而不是僅使用書籍類。要做到這一點,你將不得不使用generic type token

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

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

(?也許你的類名應該是圖書,而不是書籍 - 爲每個「書」是指一個書)

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

的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()); 
} 
+0

感謝您的回覆。爲什麼你宣佈「書籍m」變量? – labbyfrost 2012-07-28 10:23:14

+0

另外我得到一個空指針異常。我正在檢查... – labbyfrost 2012-07-28 10:25:04

+0

'書籍m'未使用,您的問題代碼中的一件神器。從答案中刪除 – pb2q 2012-07-28 16:04:59