Làm cách nào để tạo một đối tượng JSON với nhiều mảng?


83

Tôi chưa bao giờ sử dụng JSON trước đây nên tôi không quen với cú pháp của nó.

Hiện tại, tôi có nhiều mảng chứa các phần dữ liệu khác nhau.

Tôi muốn tạo một đối tượng JSON, chứa nhiều mảng, mỗi mảng có một số phần dữ liệu.

Ví dụ

Một đối tượng được gọi là ô tô, chứa nhiều mảng, mỗi mảng cho một loại ô tô khác nhau. Trong mỗi mảng sẽ là mô hình ô tô cùng với một số loại dữ liệu khác, ví dụ như số cửa (không thực sự quan trọng, nó chỉ là một ví dụ hư cấu).

Nó sẽ được đánh giá rất cao nếu ai đó giải thích cú pháp với một ví dụ.


2
Bạn không làm việc trực tiếp với JSON, trừ một số trường hợp rất hiếm. Bạn làm việc với các cấu trúc dữ liệu gốc, sau đó sử dụng thư viện để chuyển đổi cấu trúc đó thành một chuỗi JSON.
Marc B

Câu trả lời:


160

Ở cấp ngoài cùng, một đối tượng JSON bắt đầu bằng a {và kết thúc bằng a }.

Dữ liệu mẫu:

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

Nếu JSON được gán cho một biến được gọi là dữ liệu, thì việc truy cập nó sẽ giống như sau:

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

Một cách tiếp cận khác (sử dụng một mảng kết hợp cho các kiểu xe thay vì một mảng được lập chỉ mục):

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

Biên tập:

Sửa: Một đối tượng JSON bắt đầu bằng {và kết thúc bằng }, nhưng cũng hợp lệ để có một mảng JSON (ở cấp ngoài cùng), bắt đầu bằng [và kết thúc bằng ].

Ngoài ra, các lỗi cú pháp quan trọng trong dữ liệu JSON gốc đã được sửa: Tất cả các tên khóa trong đối tượng JSON phải nằm trong dấu ngoặc kép và tất cả các giá trị chuỗi trong đối tượng JSON hoặc mảng JSON cũng phải nằm trong dấu ngoặc kép.

Xem:


Chỉ để làm rõ: đây có phải là một đối tượng? Nó có cần dấu ngoặc [] không?
Harry

5
Dữ liệu JSON là một đối tượng (về cơ bản là một mảng kết hợp). Mảng được lập chỉ mục sử dụng dấu ngoặc vuông [0,1,2], trong khi mảng kết hợp sử dụng dấu ngoặc nhọn {x:1,y:2,z:3},. Bất kỳ dữ liệu nào trong đối tượng ngoài cùng có thể là một trong hai kiểu mảng, nhưng đối tượng ngoài cùng phải sử dụng dấu ngoặc nhọn.
Matt Coughlin

Và làm cách nào để tôi đi vòng qua các thị trấn trong đây: pastebin.com/qyQ2Y9sn để tôi có thể truy cập vĩ độ và lng.
Harry

1
for (var town in markers.towns) { alert(markers.towns[town].lat) }
Matt Coughlin

1
Chắc chắn, không có vấn đề gì :) Tôi đã thêm một số ví dụ về việc lặp qua dữ liệu JSON trong cả hai ví dụ trên.
Matt Coughlin

21

Một cuốn sách hay mà tôi đang đọc: JavaScript chuyên nghiệp dành cho nhà phát triển web của Nicholas C. Zakas Phiên bản thứ 3 có thông tin sau về Cú pháp JSON:

"Cú pháp JSON cho phép biểu diễn ba loại giá trị".

Về thứ bạn quan tâm, Arrays nó nói:

"Mảng được biểu diễn trong JSON bằng cách sử dụng ký hiệu chữ mảng từ JavaScript. Ví dụ: đây là một mảng trong JavaScript:

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

Bạn có thể biểu diễn cùng một mảng này trong JSON bằng cú pháp tương tự:

[25, "hi", true]

Lưu ý sự vắng mặt của một biến hoặc dấu chấm phẩy. Mảng và đối tượng có thể được sử dụng cùng nhau để biểu diễn các bộ sưu tập dữ liệu phức tạp hơn, chẳng hạn như:

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

Mảng này chứa một số đối tượng đại diện cho sách, Mỗi đối tượng có một số khóa, một trong số đó là "tác giả", là một mảng khác. Đối tượng và mảng thường là các phần cấp cao nhất của cấu trúc dữ liệu JSON (mặc dù điều này không bắt buộc) và có thể được sử dụng để tạo một số lượng lớn cấu trúc dữ liệu. "

Để tuần tự hóa (chuyển đổi) một đối tượng JavaScript thành một chuỗi JSON, bạn có thể sử dụng phương thức stringify () đối tượng JSON. Đối với ví dụ từ câu trả lời Mark Linus:

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

ô tô bây giờ là một đối tượng JavaScript. Để chuyển đổi nó thành một đối tượng JSON, bạn có thể làm:

var jsonCars = JSON.stringify(cars);

Kết quả là:

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

Để làm ngược lại, chuyển đổi một đối tượng JSON thành một đối tượng JavaScript (đây được gọi là phân tích cú pháp), bạn sẽ sử dụng phương thức parse (). Tìm kiếm những thuật ngữ đó nếu bạn cần thêm thông tin ... hoặc lấy cuốn sách, nó có rất nhiều ví dụ.


Trong ví dụ trên, "ấn bản" & "năm" phải ở trong dấu ngoặc kép - jsonlint.co.uk sẽ không xác thực nếu không
hãy gọi lại vào

2

Một vi dụ khac:

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

Đọc mảng

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

Sử dụng http://www.jsoneditoronline.org/ để hiểu rõ hơn về mã JSON


Cái gì với số 1 trên dòng cuối cùng thứ hai của json của bạn?
Philip Kirkbride,

1
@PhilipKirkbride Phần tử thứ hai của mảng ngoài cùng?
rootkea

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

Điều gì về việc có một mảng nhà sản xuất xe hơi bên trong đối tượng? nên cars> manufacturer> model, color, doors. (mảng trong mảng trong một đối tượng)
Harry

-4

Sử dụng phương thức dưới đây, hãy chuyển bất kỳ giá trị nào là mảng bất kỳ:

Tham số đầu vào: url, như Ví dụ: "/ node / [bất kỳ giá trị int nào của mảng] / anyKeyWhichInArray" Ví dụ: "ô tô / Nissan / [0] / model"

Nó có thể được sử dụng cho bất kỳ phản hồi nào:

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