Wie erstelle ich ein JSON-Objekt mit mehreren Arrays?

83

Ich habe JSON noch nie zuvor verwendet, daher bin ich mit seiner Syntax nicht vertraut.

Im Moment habe ich mehrere Arrays, die unterschiedliche Daten enthalten.

Ich möchte ein JSON-Objekt erstellen, das mehrere Arrays mit jeweils mehreren Daten enthält.

Z.B

Ein Objekt namens Autos, das mehrere Arrays für eine andere Automarke enthält. In jedem Array befindet sich das Automodell zusammen mit einigen anderen Datentypen, z. B. der Anzahl der Türen (spielt keine Rolle, es ist nur ein fiktives Beispiel).

Es wäre sehr dankbar, wenn jemand die Syntax anhand eines Beispiels erläutern würde.

Harry
quelle
2
Sie arbeiten nicht direkt mit JSON, außer in sehr seltenen Fällen. Sie arbeiten mit nativen Datenstrukturen und konvertieren diese Struktur mithilfe einer Bibliothek in eine JSON-Zeichenfolge.
Marc B

Antworten:

159

Auf der äußersten Ebene beginnt ein JSON-Objekt mit a {und endet mit a }.

Beispieldaten:

{
    "cars": {
        "Nissan": [
            {"model":"Sentra", "doors":4},
            {"model":"Maxima", "doors":4},
            {"model":"Skyline", "doors":2}
        ],
        "Ford": [
            {"model":"Taurus", "doors":4},
            {"model":"Escort", "doors":4}
        ]
    }
}

Wenn der JSON einer Variablen namens data zugewiesen ist, sieht der Zugriff folgendermaßen aus:

data.cars['Nissan'][0].model   // Sentra
data.cars['Nissan'][1].model   // Maxima
data.cars['Nissan'][2].doors   // 2

for (var make in data.cars) {
    for (var i = 0; i < data.cars[make].length; i++) {
        var model = data.cars[make][i].model;
        var doors = data.cars[make][i].doors;
        alert(make + ', ' + model + ', ' + doors);
    }
}

Ein anderer Ansatz (Verwendung eines assoziativen Arrays für Automodelle anstelle eines indizierten Arrays):

{
    "cars": {
        "Nissan": {
            "Sentra": {"doors":4, "transmission":"automatic"},
            "Maxima": {"doors":4, "transmission":"automatic"}
        },
        "Ford": {
            "Taurus": {"doors":4, "transmission":"automatic"},
            "Escort": {"doors":4, "transmission":"automatic"}
        }
    }
}

data.cars['Nissan']['Sentra'].doors   // 4
data.cars['Nissan']['Maxima'].doors   // 4
data.cars['Nissan']['Maxima'].transmission   // automatic

for (var make in data.cars) {
    for (var model in data.cars[make]) {
        var doors = data.cars[make][model].doors;
        alert(make + ', ' + model + ', ' + doors);
    }
}

Bearbeiten:

Korrektur: Ein JSON-Objekt beginnt mit {und endet mit }, es ist jedoch auch gültig, ein JSON-Array (auf der äußersten Ebene) zu haben, das mit beginnt [und mit endet ].

Außerdem wurden signifikante Syntaxfehler in den ursprünglichen JSON-Daten korrigiert: Alle Schlüsselnamen in einem JSON-Objekt müssen in doppelten Anführungszeichen stehen, und alle Zeichenfolgenwerte in einem JSON-Objekt oder einem JSON-Array müssen ebenfalls in doppelten Anführungszeichen stehen.

Sehen:

Matt Coughlin
quelle
Nur um zu verdeutlichen: Ist das ein Objekt? Benötigt es [] Klammern?
Harry
5
Die JSON-Daten sind ein Objekt (im Grunde ein assoziatives Array). Indizierte Arrays verwenden eckige Klammern, [0,1,2]während assoziative Arrays geschweifte Klammern verwenden {x:1,y:2,z:3}. Alle Daten im äußersten Objekt können beide Arten von Arrays sein, das äußerste Objekt selbst muss jedoch geschweifte Klammern verwenden.
Matt Coughlin
Und wie würde ich die Städte hier durchlaufen: pastebin.com/qyQ2Y9sn, damit ich auf lat und lng zugreifen kann.
Harry
1
for (var town in markers.towns) { alert(markers.towns[town].lat) }
Matt Coughlin
1
Sicher, kein Problem :) Ich habe in beiden obigen Beispielen einige Beispiele für das Durchlaufen der JSON-Daten hinzugefügt.
Matt Coughlin
21

Ein gutes Buch, das ich gerade lese: Professionelles JavaScript für Webentwickler von Nicholas C. Zakas 3. Ausgabe enthält die folgenden Informationen zur JSON-Syntax:

"JSON-Syntax ermöglicht die Darstellung von drei Arten von Werten".

In Bezug auf das, an dem Sie interessiert sind, heißt es in Arrays:

"Arrays werden in JSON in Array-Literal-Notation aus JavaScript dargestellt. Dies ist beispielsweise ein Array in JavaScript:

var values = [25, "hi", true];

Sie können dasselbe Array in JSON mit einer ähnlichen Syntax darstellen:

[25, "hi", true]

Beachten Sie das Fehlen einer Variablen oder eines Semikolons. Arrays und Objekte können zusammen verwendet werden, um komplexere Datensammlungen darzustellen, z.

{
    "books":
              [
                {
                    "title": "Professional JavaScript",
                    "authors": [
                        "Nicholas C. Zakas"
                    ],
                    "edition": 3,
                    "year": 2011
                },
                {
                    "title": "Professional JavaScript",
                    "authors": [
                        "Nicholas C.Zakas"
                    ],
                    "edition": 2,
                    "year": 2009
                },
                {
                    "title": "Professional Ajax",
                    "authors": [
                        "Nicholas C. Zakas",
                        "Jeremy McPeak",
                        "Joe Fawcett"
                    ],
                    "edition": 2,
                    "year": 2008
                }
              ]
}

Dieses Array enthält eine Reihe von Objekten, die Bücher darstellen. Jedes Objekt verfügt über mehrere Schlüssel, von denen einer "Autoren" und ein anderes Array ist. Objekte und Arrays sind in der Regel Teile einer JSON-Datenstruktur der obersten Ebene (obwohl dies nicht erforderlich ist) und können zum Erstellen einer großen Anzahl von Datenstrukturen verwendet werden. "

Um ein JavaScript-Objekt in eine JSON-Zeichenfolge zu serialisieren (zu konvertieren), können Sie die JSON-Objekt-Methode stringify () verwenden. Für das Beispiel von Mark Linus antworten Sie:

var cars = [{
    color: 'gray',
    model: '1',
    nOfDoors: 4
    },
    {
    color: 'yellow',
    model: '2',
    nOfDoors: 4
}];

Autos ist jetzt ein JavaScript-Objekt. So konvertieren Sie es in ein JSON-Objekt:

var jsonCars = JSON.stringify(cars);

Welche Ausbeuten:

"[{"color":"gray","model":"1","nOfDoors":4},{"color":"yellow","model":"2","nOfDoors":4}]"

Um das Gegenteil zu tun, konvertieren Sie ein JSON-Objekt in ein JavaScript-Objekt (dies wird als Parsing bezeichnet). Sie würden die parse () -Methode verwenden. Suchen Sie nach diesen Begriffen, wenn Sie weitere Informationen benötigen ... oder holen Sie sich das Buch, es enthält viele Beispiele.

Obed
quelle
Im obigen Beispiel sollte "edition" & "year" in Anführungszeichen stehen - jsonlint.co.uk wird sonst nichts validieren
rexall
2

Ein anderes Beispiel:

[  
[  
    {  
        "@id":1,
        "deviceId":1,
        "typeOfDevice":"1",
        "state":"1",
        "assigned":true
    },
    {  
        "@id":2,
        "deviceId":3,
        "typeOfDevice":"3",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":3,
        "deviceId":4,
        "typeOfDevice":"júuna",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":4,
        "deviceId":5,
        "typeOfDevice":"nffjnff",
        "state":"Regular",
        "assigned":true
    },
    {  
        "@id":5,
        "deviceId":6,
        "typeOfDevice":"44",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":6,
        "deviceId":7,
        "typeOfDevice":"rr",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":7,
        "deviceId":8,
        "typeOfDevice":"j",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":8,
        "deviceId":9,
        "typeOfDevice":"55",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":9,
        "deviceId":10,
        "typeOfDevice":"5",
        "state":"Excelent",
        "assigned":true
    },
    {  
        "@id":10,
        "deviceId":11,
        "typeOfDevice":"5",
        "state":"Excelent",
        "assigned":true
    }
],
1
]

Lesen Sie die Arrays

$.each(data[0], function(i, item) {
         data[0][i].deviceId + data[0][i].typeOfDevice  + data[0][i].state +  data[0][i].assigned 
    });

Verwenden Sie http://www.jsoneditoronline.org/ , um den JSON-Code besser zu verstehen

Jason Glez
quelle
Was ist mit der 1 in der vorletzten Zeile Ihres Json?
Philip Kirkbride
1
@PhilipKirkbride Zweites Element des äußersten Arrays?
Rootkea
1
var cars = [
    manufacturer: [
        {
            color: 'gray',
            model: '1',
            nOfDoors: 4
        },
        {
            color: 'yellow',
            model: '2',
            nOfDoors: 4
        }
    ]
]
Danilo Valente
quelle
Was ist mit einem Autohersteller-Array im Objekt? so cars> manufacturer> model, color, doors. (Arrays innerhalb von Arrays innerhalb eines Objekts)
Harry
-4

Übergeben Sie mit der folgenden Methode einen beliebigen Wert, der ein beliebiges Array ist:

Eingabeparameter: url, wie Beispiel: "/ node / [beliebiger int-Wert des Arrays] / anyKeyWhichInArray" Beispiel: "cars / Nissan / [0] / model"

Es kann für jede Antwort verwendet werden:

    public String getResponseParameterThroughUrl(Response r, String url) throws JsonProcessingException, IOException {
    String value = "";
    String[] xpathOrder = url.split("/");
    ObjectMapper objectMapper = new ObjectMapper();
    String responseData = r.getBody().asString();       
    JSONObject jsonObject = new JSONObject(responseData);
    byte[] jsonData = jsonObject.toString().getBytes();
    JsonNode rootNode = objectMapper.readTree(jsonData);
    JsonNode node = null;
    for(int i=1;i<xpathOrder.length;i++) {
        if(node==null)
            node = rootNode;
        if(xpathOrder[i].contains("[")){
            xpathOrder[i] = xpathOrder[i].replace("[", "");
            xpathOrder[i] = xpathOrder[i].replace("]", "");
            node = node.get(Integer.parseInt(xpathOrder[i]));
        }
        else
            node = node.path(xpathOrder[i]);
    }
    value = node.asText();
    return value;
}
Ankit Gupta
quelle