Як зробити об’єкт JSON з кількома масивами?


83

Я ніколи раніше не використовував JSON, тому я не знайомий з його синтаксисом.

На даний момент у мене є кілька масивів, що містять різні фрагменти даних.

Я хотів би створити один об'єкт JSON, який містить кілька масивів, кожен з кількома фрагментами даних.

Напр

Об'єкт, який називається автомобілями, містить кілька масивів, кожен для різних марок автомобілів. У кожному масиві буде модель автомобіля разом з деякими іншими типами даних, наприклад кількістю дверей (насправді це не має значення, це лише вигаданий приклад).

Буде дуже вдячно, якщо хтось пояснить синтаксис на прикладі.


2
Ви не працюєте безпосередньо з JSON, за винятком дуже рідкісних обставин. Ви працюєте з власними структурами даних, а потім використовуєте бібліотеку, щоб перетворити цю структуру на рядок JSON.
Marc B

Відповіді:


160

На самому зовнішньому рівні об’єкт JSON починається з a {і закінчується a }.

Зразки даних:

{
    "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.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, щоб я міг отримати доступ до lat та lng.
Гаррі

1
for (var town in markers.towns) { alert(markers.towns[town].lat) }
Метт Кофлін,

1
Звичайно, немає проблем :) Я додав кілька прикладів ітерації даних JSON в обох прикладах вище.
Matt Coughlin

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, ви можете використати метод об’єкта JSON stringify (). Для прикладу з відповіді Марка Лінуса:

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.