web-dev-qa-db-fra.com

Objets JSON imbriqués - dois-je utiliser des tableaux pour tout?

Existe-t-il un moyen d’avoir des objets imbriqués dans JSON afin que je n’aie pas à tout faire pour faire des tableaux? Pour que mon objet soit analysé sans erreur, il me semble avoir besoin d'une structure comme celle-ci:

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

Si je récupère cet objet dans une variable appelée "résultat", je dois accéder aux objets imbriqués comme ceci:

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

et

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

Cela me semble maladroit et superflu, si possible je préférerais:

result.stuff.onetype[0]

et

result.otherstuff.thing

Mais comment puis-je utiliser les clés d'objet directement quand tout est un tableau? Quelque chose comme ceci semblerait plus approprié pour mon esprit confus et peu éduqué:

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

J'ai probablement mal compris quelque chose de fondamental ici, mais je ne peux pas obtenir l'analyseur jQuery (ni l'analyseur FF natif utilisé par jQuery 1.4) pour accepter l'objet de second style. Si quelqu'un peut m'éclairer, ce serait grandement apprécié!

98
John Schulze

Vous n'avez pas besoin d'utiliser des tableaux.

Les valeurs JSON peuvent être des tableaux, des objets ou des primitives (nombres ou chaînes).

Vous pouvez écrire JSON comme ceci:

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

Vous pouvez l'utiliser comme ceci:

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

Chaque objet doit être nommé à l'intérieur de l'objet parent:

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

Donc, vous ne pouvez pas déclarer un objet comme celui-ci:

var obj = {property1, property2};

Il doit être

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

Vous avez trop de tableaux imbriqués redondants dans vos données jSON, mais il est possible de récupérer les informations. Bien que, comme d'autres l'ont déjà dit, vous souhaitiez peut-être le nettoyer.

utilisez each () envelopper dans un autre each () jusqu'au dernier tableau.

pour result.data[0].stuff[0].onetype[0] dans jQuery vous pouvez effectuer les opérations suivantes:

`

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

});

`

8
syarul