2015-04-30 18 views
24

Tôi có một JSON rất đơn giản với ý kiến ​​cho sản phẩm, như:làm thế nào để phân tích tệp JSON với 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." 
} 

Tôi muốn đọc nó vào ứng dụng Java của tôi sử dụng GSON. Tôi đã xây dựng một lớp học để giữ kết quả cho mỗi lần xem xét:

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... 

Để đọc các tập tin JSON, mã của tôi là:

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 

Với mã này, tôi chỉ có thể lấy việc xem xét đầu tiên trong JSON , vì vậy câu hỏi của tôi là: làm thế nào để lặp qua tất cả người đọc và nhận được các đánh giá tiếp theo? Tôi không cần lưu trữ các đánh giá trong Danh sách, chỉ cần truy cập vào đối tượng một lần. Bất kỳ sự giúp đỡ nào nhiều hơn sự chào đón.

+0

Phân tích chuỗi bạn nhận được thành một JSONArray mới(). Đối với mỗi đối tượng trong mảng, hãy thực hiện gson.fromJson (đối tượng, Review.class), sau đó thêm tất cả chúng vào danh sách trống list = new LinkedList (); Như trong, phân tích chúng tất cả tuần tự. – Schaka

Trả lời

42

Bạn phải tìm nạp toàn bộ dữ liệu trong danh sách và sau đó thực hiện lặp lại vì nó là một tệp và sẽ trở nên không hiệu quả nếu không.

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

Tôi có lỗi này với mã của bạn: java.lang.IllegalStateException: Dự kiến ​​BEGIN_ARRAY nhưng đã BEGIN_OBJECT ở dòng 1 cột 2 đường dẫn $ – user299791

+1

kiểm tra xem tệp json của bạn có đúng định dạng hay không ở [jsonlint] (http: // jsonlint. com) –

+1

@Archit Maheshwari - Dữ liệu nhập được định dạng chính xác và hợp lệ. Nó chứa hai cấu trúc dữ liệu JSON của kiểu 'đối tượng'. Đó là ví dụ của bạn mà không làm việc, ít nhất là không với gson 2.8.0. Tuy nhiên, tôi tin rằng ví dụ của bạn cung cấp một cách tiếp cận thú vị như thế nào để giải quyết vấn đề. Tôi đề nghị thêm nó vào danh sách mong ước của Gson. – whaefelinger

17

chỉ cần phân tích như một mảng:

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

sau đó nếu bạn cần bạn cũng có thể tạo một danh sách theo cách này:

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

T.B. chuỗi json của bạn sẽ trông giống như sau:

[ 
    { 
     "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

Tôi gặp lỗi với mã của bạn: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Giá trị kỳ vọng tại đường 1 cột 1 đường dẫn $ – user299791

+1

hiển thị cho chúng tôi các dòng đầu tiên của chuỗi json THỰC – dit

+0

xin lỗi của tôi tập tin là 3GB, tôi đã cố gắng để tải với VIM nhưng không thể tải nó – user299791

Các vấn đề liên quan