0

ファイル名に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());

最初の行しか印刷できませんが、他の行を解析する必要がある場合はどうすればよいですか?

4

3 に答える 3

0

コメントにあるように、それは有効なjson文字列ではありません(jsonlintを使用してjsonを検証できます)。

本の要素が各本の後にコンマを含むリストに含まれている場合は、本のクラスを使用するだけでなく、本のリストに変換する必要があります。これを行うには、ジェネリック型トークンを使用する必要があります。

この場合、次のようになります。

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

(多分あなたのクラス名は本ではなく本でなければなりませんか?-各「本」は1冊の本を意味するので)

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

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