2015-04-30 2 views
24

У меня есть очень простой JSON с обзорами для продуктов, как:как разобрать файл JSON с GSON

{ 
    "reviewerID": "A2XVJBSRI3SWDI", 
    "asin": "0000031887", 
    "reviewerName": "abigail", 
    "helpful": [0, 0], 
    "unixReviewTime": 1383523200, 
    "reviewText": "Perfect red tutu for the price. ", 
    "overall": 5.0, 
    "reviewTime": "11 4, 2013", "summary": "Nice tutu" 
} 
{ 
    "reviewerID": "A2G0LNLN79Q6HR", 
    "asin": "0000031887", 
    "reviewerName": "aj_18 \"Aj_18\"", 
    "helpful": [1, 1], 
    "unixReviewTime": 1337990400, 
    "reviewText": "This was a really cute", 
"overall": 4.0, 
"reviewTime": "05 26, 2012", 
"summary": "Really Cute but rather short." 
} 

Я хотел бы, чтобы прочитать его в мое приложение Java с помощью GSON. Я построил класс для хранения результатов для каждого обзора:

public class Review { 
    private String reviewerID; 
    private String asin; 
    private String reviewerName; 
    private ArrayList<Integer> helpful; 
    private String reviewText; 
    private Double overall; 
    private String summary; 
    private Long unixReviewTime; 
    private String reviewTime; 

    public Review() { 
     this.helpful = Lists.newArrayList(); 
    } 
    // some getters and setters... 

Для чтения файла в формате JSON, мой код:

Gson gson = new Gson(); 
JsonReader reader = new JsonReader(new FileReader(filename)); 
Review data = gson.fromJson(reader, Review.class); 
data.toScreen(); // prints to screen some values 

С помощью этого кода, я могу только получить первый обзор в формате JSON , поэтому мой вопрос: как пройти через все читателя и получить следующие обзоры? Мне не нужно хранить обзоры в списке, просто нужно получить доступ к объекту один раз. Любая помощь более чем приветствуется.

+0

Разберите строку, которую вы получите, в новый JSONArray(). Для каждого объекта в массиве do gson.fromJson (object, Review.class), затем добавьте все их в пустой список list = new LinkedList (); Как и в, разбирайте их все последовательно. – Schaka

ответ

42

Вы должны извлечь все данные из списка, а затем выполнить итерацию, поскольку это файл, и в противном случае он станет неэффективным.

private static final Type REVIEW_TYPE = new TypeToken<List<Review>>() { 
}.getType(); 
Gson gson = new Gson(); 
JsonReader reader = new JsonReader(new FileReader(filename)); 
List<Review> data = gson.fromJson(reader, REVIEW_TYPE); // contains the whole reviews list 
data.toScreen(); // prints to screen some values 
+1

У меня есть эта ошибка с вашим кодом: java.lang.IllegalStateException: ожидается BEGIN_ARRAY, но BEGIN_OBJECT в строке 1 столбец 2 путь $ – user299791

+1

проверить, находится ли ваш json-файл в правильном формате или нет в [jsonlint] (http: // jsonlint. com) –

+1

@Archit Maheshwari - вход правильно отформатирован и действителен. Он содержит две структуры данных JSON типа «объект». Это ваш пример, который не работает, по крайней мере, не с gson 2.8.0. Тем не менее, я считаю, что ваш пример представляет интересный подход, как решить проблему. Я предлагаю добавить его в список желаний Гссона. – whaefelinger

17

просто разобрать как массив:

Review[] reviews = new Gson().fromJson(jsonString, Review[].class); 

тогда, если вам нужно, чтобы вы также можете создать список таким образом:

List<Review> asList = Arrays.asList(reviews); 

P.S. ваша строка json должна выглядеть примерно так:

[ 
    { 
     "reviewerID": "A2SUAM1J3GNN3B1", 
     "asin": "0000013714", 
     "reviewerName": "J. McDonald", 
     "helpful": [2, 3], 
     "reviewText": "I bought this for my husband who plays the piano.", 
     "overall": 5.0, 
     "summary": "Heavenly Highway Hymns", 
     "unixReviewTime": 1252800000, 
     "reviewTime": "09 13, 2009" 
    }, 
    { 
     "reviewerID": "A2SUAM1J3GNN3B2", 
     "asin": "0000013714", 
     "reviewerName": "J. McDonald", 
     "helpful": [2, 3], 
     "reviewText": "I bought this for my husband who plays the piano.", 
     "overall": 5.0, 
     "summary": "Heavenly Highway Hymns", 
     "unixReviewTime": 1252800000, 
     "reviewTime": "09 13, 2009" 
    }, 

    [...] 
] 
+0

Я получаю сообщение об ошибке с вашим кодом: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: ожидаемое значение в строке 1 столбец 1 путь $ – user299791

+1

показать нам первые строки вашей строки REAL json – dit

+0

извините мой файл 3 ГБ, я попытался загрузить с VIM, но не могу загрузить его – user299791

Смежные вопросы