Sử dụng GSON để phân tích cú pháp một mảng JSON


110

Tôi có một tệp JSON như sau:

[
    {
        "number": "3",
        "title": "hello_world",
    }, {
        "number": "2",
        "title": "hello_world",
    }
]

Trước khi các tệp có phần tử gốc, tôi sẽ sử dụng:

Wrapper w = gson.fromJson(JSONSTRING, Wrapper.class);

nhưng tôi không thể nghĩ cách viết mã Wrapperlớp vì phần tử gốc là một mảng.

Tôi đã thử sử dụng:

Wrapper[] wrapper = gson.fromJson(jsonLine, Wrapper[].class);

với:

public class Wrapper{

    String number;
    String title;

}

Nhưng chưa gặp may. Làm thế nào khác tôi có thể đọc này bằng cách sử dụng phương pháp này?

Tái bút Tôi có cái này để làm việc bằng cách sử dụng:

JsonArray entries = (JsonArray) new JsonParser().parse(jsonLine);
String title = ((JsonObject)entries.get(0)).get("title");

Nhưng tôi muốn biết cách thực hiện (nếu có thể) bằng cả hai phương pháp.


4
Bạn có chắc chắn có dấu phẩy sau các phần tử tiêu đề không? Nếu bạn loại bỏ chúng Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);hoạt động tốt cho tôi.
Pshemo

1
Đó là vấn đề .. một sai lầm đơn giản như vậy!
Eduardo

Câu trả lời:


112

Vấn đề là do dấu phẩy ở cuối (trong trường hợp của bạn là mỗi ) đối tượng JSON được đặt trong mảng:

{
    "number": "...",
    "title": ".." ,  //<- see that comma?
}

Nếu bạn xóa chúng, dữ liệu của bạn sẽ trở thành

[
    {
        "number": "3",
        "title": "hello_world"
    }, {
        "number": "2",
        "title": "hello_world"
    }
]

Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);

sẽ hoạt động tốt.



1
@Snake BTW, trong trường hợp jacksonthư viện và chú thích này tạo mảng và bao bọc nó Arrays.asList(..)sẽ nhanh hơn tạo danh sách bằng TypeRefence. Tôi đã không kiểm tra nó bằng gsonthư viện nhưng nó có thể đáng để đánh giá nó.
Pshemo

39
Gson gson = new Gson();
Wrapper[] arr = gson.fromJson(str, Wrapper[].class);

class Wrapper{
    int number;
    String title;       
}

Có vẻ hoạt động tốt. Nhưng có thêm một ,Dấu phẩy trong chuỗi của bạn.

[
    { 
        "number" : "3",
        "title" : "hello_world"
    },
    { 
        "number" : "2",
        "title" : "hello_world"
    }
]

16
public static <T> List<T> toList(String json, Class<T> clazz) {
    if (null == json) {
        return null;
    }
    Gson gson = new Gson();
    return gson.fromJson(json, new TypeToken<T>(){}.getType());
}

cuộc gọi mẫu:

List<Specifications> objects = GsonUtils.toList(products, Specifications.class);

4
Đối với tôi, điều này đang biến các đối tượng của tôi thành một Danh sách LinkedTreeMap thay vì một Danh sách các đối tượng Đặc điểm kỹ thuật (ví dụ).
Ryan Newsom

Bạn lấy lớp GsonUtils ở đâu?
rosu alin

GsonUtilslà lớp mà anh ấy đặt toList()phương pháp của riêng mình .
user1438038

Điều này không thể hoạt động: TypeToken phải tạo một giá trị sai vì T không biết khi nào điều này được biên dịch. Điều đó có thể sẽ tạo mã thông báo loại cho Danh sách <Đối tượng>. Bạn phải sử dụng lớp thực tế khi tạo kiểu.
Hans-Peter Störr

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.