Как создать объект JSON с несколькими массивами?

83

Я никогда раньше не использовал JSON, поэтому не знаком с его синтаксисом.

На данный момент у меня есть несколько массивов, содержащих разные данные.

Я хотел бы создать один объект JSON, содержащий несколько массивов, каждый с несколькими частями данных.

Например

Объект с именем cars, содержащий несколько массивов автомобилей разных марок. В каждом массиве будет модель автомобиля вместе с некоторыми другими типами данных, например, количеством дверей (на самом деле это не имеет значения, это просто вымышленный пример).

Мы были бы очень признательны, если бы кто-нибудь объяснил синтаксис на примере.

Гарри
источник
2
Вы не работаете с JSON напрямую, за исключением очень редких случаев. Вы работаете с собственными структурами данных, а затем используете библиотеку для преобразования этой структуры в строку JSON.
Marc B

Ответы:

160

На самом внешнем уровне объект JSON начинается с {и заканчивается }.

Пример данных:

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

Если JSON назначен переменной с именем data, то доступ к нему будет таким:

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);
    }
}

Другой подход (использование ассоциативного массива для моделей автомобилей, а не индексированного массива):

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

Редактировать:

Исправление: объект JSON начинается с {и заканчивается }, но также допустимо наличие массива JSON (на самом внешнем уровне), который начинается с [и заканчивается на ].

Кроме того, были исправлены значительные синтаксические ошибки в исходных данных JSON: все имена ключей в объекте JSON должны быть в двойных кавычках, а все строковые значения в объекте JSON или массиве JSON также должны быть в двойных кавычках.

Видеть:

Мэтт Кафлин
источник
Просто уточнить: это объект? Нужны ли [] скобки?
Гарри
5
Данные JSON - это объект (в основном ассоциативный массив). Индексированные массивы используют квадратные скобки [0,1,2], в то время как ассоциативные массивы используют фигурные скобки, {x:1,y:2,z:3}. Любые данные в самом внешнем объекте могут быть массивами любого типа, но самый внешний объект должен использовать фигурные скобки.
Мэтт Кафлин,
И как бы мне перебрать города в этом: pastebin.com/qyQ2Y9sn, чтобы я мог получить доступ к широте и долготе.
Гарри
1
for (var town in markers.towns) { alert(markers.towns[town].lat) }
Мэтт Кафлин,
1
Конечно, без проблем :) Я добавил несколько примеров перебора данных JSON в оба примера выше.
Мэтт Кафлин,
21

Хорошая книга, которую я читаю: «Профессиональный JavaScript для веб-разработчиков» Николаса К. Закаса, 3-е издание, содержит следующую информацию о синтаксисе JSON:

«Синтаксис JSON позволяет представлять три типа значений».

Что касается того, что вас интересует, Arrays говорит:

"Массивы представлены в JSON с использованием буквального обозначения массива из JavaScript. Например, это массив в JavaScript:

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

Вы можете представить этот же массив в JSON, используя аналогичный синтаксис:

[25, "hi", true]

Обратите внимание на отсутствие переменной или точки с запятой. Массивы и объекты могут использоваться вместе для представления более сложных коллекций данных, таких как:

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

Этот массив содержит ряд объектов, представляющих книги. Каждый объект имеет несколько ключей, один из которых - «авторы», а другой массив. Объекты и массивы обычно являются частями верхнего уровня структуры данных JSON (даже если это не требуется) и могут использоваться для создания большого количества структур данных ».

Чтобы сериализовать (преобразовать) объект JavaScript в строку JSON, вы можете использовать метод Stringify () объекта JSON. Например, ответ Марка Линуса:

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

cars теперь является объектом JavaScript. Чтобы преобразовать его в объект JSON, вы можете:

var jsonCars = JSON.stringify(cars);

Который дает:

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

Чтобы сделать наоборот, преобразовать объект JSON в объект JavaScript (это называется синтаксическим анализом), вы должны использовать метод parse (). Поищите эти термины, если вам нужна дополнительная информация ... или найдите книгу, в ней много примеров.

Обед
источник
В приведенном выше примере «издание» и «год» должны быть заключены в кавычки - в противном случае jsonlint.co.uk не будет проверяться
rexall
2

Другой пример:

[  
[  
    {  
        "@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
]

Прочтите массив

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

Используйте http://www.jsoneditoronline.org/, чтобы лучше понять код JSON.

Джейсон Глез
источник
Что с 1 во второй последней строке вашего json?
Филип Киркбрайд,
1
@PhilipKirkbride Второй элемент внешнего массива?
rootkea
1
var cars = [
    manufacturer: [
        {
            color: 'gray',
            model: '1',
            nOfDoors: 4
        },
        {
            color: 'yellow',
            model: '2',
            nOfDoors: 4
        }
    ]
]
Данило Валенте
источник
А как насчет наличия массива производителей автомобилей внутри объекта? так cars> manufacturer>model, color, doors . (массивы внутри массивов внутри объекта)
Гарри
-4

Используя метод ниже, передайте любое значение, которое является любым массивом:

Входной параметр: url, например Пример: "/ node / [любое значение массива int] / anyKeyWhichInArray" Пример: "cars / Nissan / [0] / model"

Его можно использовать для любого ответа:

    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;
}
Анкит Гупта
источник