ใช้ GSON เพื่อแยกวิเคราะห์อาร์เรย์ JSON


110

ฉันมีไฟล์ JSON ดังนี้:

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

ก่อนหน้านี้เมื่อไฟล์มีองค์ประกอบรูทฉันจะใช้:

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

code แต่ฉันคิดไม่ออกว่าจะโค้ดWrapperคลาสอย่างไรเนื่องจากองค์ประกอบรูทเป็นอาร์เรย์

ฉันได้ลองใช้:

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

กับ:

public class Wrapper{

    String number;
    String title;

}

แต่ยังไม่มีโชค ฉันจะอ่านสิ่งนี้โดยใช้วิธีนี้ได้อย่างไร

ปล. ฉันทำให้สิ่งนี้ใช้งานได้โดยใช้:

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

แต่ฉันอยากรู้วิธีทำ (ถ้าเป็นไปได้) ด้วยทั้งสองวิธี


4
แน่ใจไหมว่ามีเครื่องหมายจุลภาคหลังองค์ประกอบชื่อเรื่อง ถ้าคุณลบออกก็Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);ใช้ได้ดีสำหรับฉัน
Pshemo

1
นั่นคือปัญหา .. ผิดพลาดง่ายๆ!
Eduardo

คำตอบ:


112

ปัญหาเกิดจากลูกน้ำที่ท้าย (ในกรณีของคุณแต่ละตัว ) ออบเจ็กต์ JSON ที่วางในอาร์เรย์

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

หากคุณลบออกข้อมูลของคุณจะกลายเป็น

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

และ

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

ควรทำงานได้ดี



1
@Snake BTW ในกรณีของjacksonไลบรารีและความคิดเห็นนี้การสร้างอาร์เรย์และการห่อด้วยArrays.asList(..)นั้นเร็วกว่าการสร้างรายการโดยใช้ TypeRefence ฉันไม่ได้ทดสอบกับgsonไลบรารี แต่มันอาจคุ้มค่าที่จะเปรียบเทียบกับมัน
Pshemo

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

class Wrapper{
    int number;
    String title;       
}

ดูเหมือนจะทำงานได้ดี แต่มี,จุลภาคพิเศษในสตริงของคุณ

[
    { 
        "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());
}

โทรตัวอย่าง:

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

4
สำหรับฉันนี่เป็นการเปลี่ยนวัตถุของฉันให้เป็น List of LinkedTreeMap แทนที่จะเป็น List of Specification objects (ตัวอย่างเช่น)
Ryan Newsom

คุณได้รับคลาส GsonUtils ที่ไหน
rosu alin

GsonUtilsเป็นชั้นเรียนที่เขาใช้toList()วิธีการของตัวเอง
user1438038

สิ่งนี้ใช้ไม่ได้: TypeToken ต้องสร้างค่าที่ไม่ถูกต้องเนื่องจากไม่ทราบ T เมื่อมีการคอมไพล์ นั่นอาจเป็นการสร้างโทเค็นประเภทสำหรับรายการ <วัตถุ> คุณต้องใช้คลาสจริงเมื่อสร้างประเภท
Hans-Peter Störr

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.