Các đối tượng JSON lồng nhau - tôi có phải sử dụng mảng cho mọi thứ không?


108

Có cách nào để có các đối tượng lồng nhau trong JSON để tôi không phải tạo mảng từ mọi thứ không? Để đối tượng của tôi được phân tích cú pháp mà không gặp lỗi, tôi dường như cần một cấu trúc như sau:

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

Nếu tôi tìm nạp đối tượng này vào một biến có tên "result", tôi phải truy cập vào các đối tượng lồng nhau như sau:

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

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

Điều này có vẻ vụng về và thừa đối với tôi, nếu có thể tôi muốn:

result.stuff.onetype[0]

result.otherstuff.thing

Nhưng làm thế nào tôi có thể sử dụng các khóa đối tượng trực tiếp khi mọi thứ đều là một mảng? Đối với tâm trí hoang mang và thiếu học thức của tôi, điều gì đó như thế này có vẻ thích hợp hơn:

{"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]]
        }
    }
}

Có lẽ tôi đã hiểu sai điều gì đó cơ bản ở đây, nhưng tôi không thể nhận được trình phân tích cú pháp jQuery (cũng như trình phân tích cú pháp FF gốc được sử dụng bởi jQuery 1.4) để chấp nhận đối tượng kiểu thứ hai. Nếu ai đó có thể khai sáng cho tôi, nó sẽ rất biết ơn!


1
Cú pháp cho một đối tượng với nhiều hơn một tài sản là như thế này:{"stuff": ..., "otherstuff": ...}
Jason Orendorff

1
@Jason: Anh ấy dường như đã biết điều đó; chính anh ấy đã viết {"id":2,"name": ""}. Tuy nhiên, đó ít nhiều là những gì anh ấy đang yêu cầu, vì vậy tôi không chắc.
SLaks

Câu trả lời:


201

Bạn không cần phải sử dụng mảng.

Các giá trị JSON có thể là mảng, đối tượng hoặc nguyên thủy (số hoặc chuỗi).

Bạn có thể viết JSON như thế này:

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

Bạn có thể sử dụng nó như thế này:

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

Mọi đối tượng phải được đặt tên bên trong đối tượng mẹ:

{ "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]]
    }
}
}

Vì vậy, bạn không thể khai báo một đối tượng như thế này:

var obj = {property1, property2};

Nó phải được

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

8

Bạn có quá nhiều mảng lồng nhau dư thừa bên trong dữ liệu jSON của mình, nhưng bạn có thể truy xuất thông tin. Mặc dù giống như những người khác đã nói, bạn có thể muốn dọn dẹp nó.

sử dụng mỗi () bên trong mỗi () khác cho đến mảng cuối cùng.

cho result.data[0].stuff[0].onetype[0]trong jQuery bạn có thể làm những điều sau đây:

`

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

});

`

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.