วัตถุ JSON ที่ซ้อนกัน - ฉันต้องใช้อาร์เรย์สำหรับทุกสิ่งหรือไม่


110

มีวิธีใดบ้างที่จะมีวัตถุซ้อนกันใน JSON ดังนั้นฉันจึงไม่ต้องสร้างอาร์เรย์จากทุกสิ่ง เพื่อให้วัตถุของฉันถูกแยกวิเคราะห์โดยไม่มีข้อผิดพลาดดูเหมือนว่าฉันต้องการโครงสร้างแบบนี้:

{"data":[{"stuff":[
    {"onetype":[
        {"id":1,"name":"John Doe"},
        {"id":2,"name":"Don Joeh"}
    ]},
    {"othertype":[
        {"id":2,"company":"ACME"}
    ]}]
},{"otherstuff":[
    {"thing":
        [[1,42],[2,2]]
    }]
}]}

หากฉันดึงวัตถุนี้มาเป็นตัวแปรที่เรียกว่า "ผลลัพธ์" ฉันต้องเข้าถึงวัตถุที่ซ้อนกันดังนี้:

result.data[0].stuff[0].onetype[0]

และ

result.data[1].otherstuff[0].thing[0]

สิ่งนี้ดูเหมือนเงอะงะและซ้ำซ้อนสำหรับฉันถ้าเป็นไปได้ฉันต้องการ:

result.stuff.onetype[0]

และ

result.otherstuff.thing

แต่ฉันจะใช้คีย์ออบเจ็กต์โดยตรงได้อย่างไรในเมื่อทุกอย่างเป็นอาร์เรย์ สำหรับจิตใจที่สับสนและไร้การศึกษาของฉันสิ่งนี้ดูเหมือนจะเหมาะสมกว่า:

{"data":
    {"stuff":
        {"onetype":[
            {"id":1,"name": ""},
            {"id":2,"name": ""}
        ]}
        {"othertype":[
            {"id":2,"xyz": [-2,0,2],"n":"Crab Nebula","t":0,"c":0,"d":5}
        ]}
    }
    {"otherstuff":
        {"thing":
            [[1,42],[2,2]]
        }
    }
}

ฉันอาจเข้าใจผิดบางอย่างพื้นฐานที่นี่ แต่ฉันไม่สามารถรับตัวแยกวิเคราะห์ jQuery (หรือตัวแยกวิเคราะห์ FF ดั้งเดิมที่ใช้โดย jQuery 1.4) เพื่อยอมรับวัตถุสไตล์ที่สอง หากใครสามารถสอนฉันได้ก็จะต้องขอบคุณอย่างยิ่ง!


1
ไวยากรณ์ของออบเจ็กต์ที่มีคุณสมบัติมากกว่าหนึ่งรายการมีลักษณะดังนี้{"stuff": ..., "otherstuff": ...}
Jason Orendorff

1
@ เจสัน: ดูเหมือนเขาจะรู้อยู่แล้ว; {"id":2,"name": ""}ตัวเขาเองเขียน อย่างไรก็ตามนั่นเป็นสิ่งที่เขาถามมากหรือน้อยฉันก็ไม่แน่ใจ
SLaks

คำตอบ:


204

คุณไม่จำเป็นต้องใช้อาร์เรย์

ค่า JSON อาจเป็นอาร์เรย์ออบเจ็กต์หรือพื้นฐาน (ตัวเลขหรือสตริง)

คุณสามารถเขียน JSON ได้ดังนี้:

{ 
    "stuff": {
        "onetype": [
            {"id":1,"name":"John Doe"},
            {"id":2,"name":"Don Joeh"}
        ],
        "othertype": {"id":2,"company":"ACME"}
    }, 
    "otherstuff": {
        "thing": [[1,42],[2,2]]
     }
}

คุณสามารถใช้งานได้ดังนี้:

obj.stuff.onetype[0].id
obj.stuff.othertype.id
obj.otherstuff.thing[0][1]  //thing is a nested array or a 2-by-2 matrix.
                            //I'm not sure whether you intended to do that.

9

ทุกออบเจ็กต์จะต้องถูกตั้งชื่อภายในอ็อบเจ็กต์พาเรนต์:

{ "data": {
    "stuff": {
        "onetype": [
            { "id": 1, "name": "" },
            { "id": 2, "name": "" }
        ],
        "othertype": [
            { "id": 2, "xyz": [-2, 0, 2], "n": "Crab Nebula", "t": 0, "c": 0, "d": 5 }
        ]
    },
    "otherstuff": {
        "thing":
            [[1, 42], [2, 2]]
    }
}
}

ดังนั้นคุณไม่สามารถประกาศวัตถุเช่นนี้:

var obj = {property1, property2};

มันจะต้องมี

var obj = {property1: 'value', property2: 'value'};

8

คุณมีอาร์เรย์ที่ซ้อนกันอยู่ภายในข้อมูล jSON ของคุณมากเกินไป แต่ก็สามารถดึงข้อมูลได้ แม้ว่าคนอื่น ๆ บอกว่าคุณอาจต้องการทำความสะอาด

ใช้แต่ละ () ห่อภายในแต่ละอัน () จนถึงอาร์เรย์สุดท้าย

สำหรับresult.data[0].stuff[0].onetype[0]ในjQueryคุณสามารถทำสิ่งต่อไปนี้:

`

$.each(data.result.data, function(index0, v) {
    $.each(v, function (index1, w) {
        $.each(w, function (index2, x) {
            alert(x.id);
        });
    });

});

`

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