Giới thiệu
Trước hết bạn có một chuỗi. JSON không phải là một mảng, một đối tượng hoặc cấu trúc dữ liệu. JSON là một định dạng tuần tự hóa dựa trên văn bản - vì vậy là một chuỗi ưa thích, nhưng vẫn chỉ là một chuỗi. Giải mã nó trong PHP bằng cách sử dụng json_decode()
.
$data = json_decode($json);
Trong đó bạn có thể tìm thấy:
Đây là những thứ có thể được mã hóa trong JSON. Hay chính xác hơn, đây là các phiên bản của PHP về những thứ có thể được mã hóa trong JSON.
Không có gì đặc biệt về họ. Chúng không phải là "đối tượng JSON" hoặc "mảng JSON." Bạn đã giải mã JSON - bây giờ bạn có các loại PHP cơ bản hàng ngày .
Các đối tượng sẽ là các thể hiện của stdClass , một lớp tích hợp chỉ là một thứ chung không quan trọng ở đây.
Truy cập thuộc tính đối tượng
Bạn truy cập các thuộc tính của một trong các đối tượng này giống như cách bạn làm với các thuộc tính không tĩnh công khai của bất kỳ đối tượng nào khác, ví dụ:$object->property
.
$json = '
{
"type": "donut",
"name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type; //donut
Truy cập các phần tử mảng
Bạn truy cập các phần tử của một trong các mảng này giống như cách bạn làm với bất kỳ mảng nào khác, vd $array[0]
.
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
Lặp đi lặp lại với nó foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Sôcôla tráng men với Sprinkles
Maple
Hoặc gây rối với bất kỳ hàm mảng tích hợp nào .
Truy cập các mục lồng nhau
Các thuộc tính của các đối tượng và các thành phần của mảng có thể là nhiều đối tượng và / hoặc mảng hơn - bạn chỉ cần tiếp tục truy cập vào các thuộc tính và thành viên của chúng như bình thường, ví dụ $object->array[0]->etc
.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
echo $yummy->toppings[2]->id; //5004
Truyền true
làm đối số thứ hai cho json_decode ()
Khi bạn làm điều này, thay vì các đối tượng, bạn sẽ nhận được các mảng kết hợp - mảng có chuỗi cho các khóa. Một lần nữa bạn truy cập các yếu tố của chúng như bình thường, ví dụ $array['key']
.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json, true);
echo $yummy['toppings'][2]['type']; //Maple
Truy cập các mục mảng kết hợp
Khi giải mã một đối tượng JSON thành một mảng PHP kết hợp, bạn có thể lặp lại cả khóa và giá trị bằng foreach (array_expression as $key => $value)
cú pháp, vd
$json = '
{
"foo": "foo value",
"bar": "bar value",
"baz": "baz value"
}';
$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
echo "The value of key '$key' is '$value'", PHP_EOL;
}
Bản in
Giá trị của khóa 'foo' là 'giá trị foo'
Giá trị của khóa 'bar' là 'giá trị thanh'
Giá trị của khóa 'baz' là 'giá trị baz'
Không biết dữ liệu được cấu trúc như thế nào
Đọc tài liệu cho bất cứ điều gì bạn đang nhận JSON.
Nhìn vào JSON - nơi bạn thấy dấu ngoặc nhọn {}
mong đợi một đối tượng, nơi bạn thấy dấu ngoặc vuông[]
mong đợi một mảng.
Nhấn dữ liệu được giải mã bằng print_r()
:
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
print_r($yummy);
và kiểm tra đầu ra:
stdClass Object
(
[type] => donut
[name] => Cake
[toppings] => Array
(
[0] => stdClass Object
(
[id] => 5002
[type] => Glazed
)
[1] => stdClass Object
(
[id] => 5006
[type] => Chocolate with Sprinkles
)
[2] => stdClass Object
(
[id] => 5004
[type] => Maple
)
)
)
Nó sẽ cho bạn biết nơi bạn có các đối tượng, nơi bạn có các mảng, cùng với tên và giá trị của các thành viên của chúng.
Nếu bạn chỉ có thể đi sâu vào nó trước khi bạn bị lạc - hãy đi thật xa và đánh nó với print_r()
:
print_r($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
Hãy xem nó trong trình thám hiểm JSON tương tác tiện dụng này .
Chia vấn đề thành nhiều phần dễ dàng hơn để quấn đầu bạn.
json_decode()
trả lại null
Điều này xảy ra bởi vì:
- JSON bao gồm hoàn toàn chỉ đó ,
null
.
- JSON không hợp lệ - kiểm tra kết quả
json_last_error_msg
hoặc đặt nó thông qua một cái gì đó như JSONLint .
- Nó chứa các yếu tố lồng nhau sâu hơn 512 cấp. Độ sâu tối đa mặc định này có thể được ghi đè bằng cách chuyển một số nguyên làm đối số thứ ba
json_decode()
.
Nếu bạn cần thay đổi độ sâu tối đa, có lẽ bạn đang giải quyết vấn đề sai. Tìm hiểu lý do tại sao bạn nhận được dữ liệu lồng nhau sâu sắc như vậy (ví dụ: dịch vụ bạn đang truy vấn đang tạo JSON có lỗi) và làm cho điều đó không xảy ra.
Tên thuộc tính đối tượng chứa một ký tự đặc biệt
Đôi khi, bạn sẽ có một tên thuộc tính đối tượng có chứa một cái gì đó như dấu gạch nối -
hoặc dấu hiệu @
không thể được sử dụng trong một định danh bằng chữ. Thay vào đó, bạn có thể sử dụng một chuỗi ký tự trong các dấu ngoặc nhọn để giải quyết nó.
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
Nếu bạn có một số nguyên là thuộc tính, hãy xem: Làm thế nào để truy cập các thuộc tính đối tượng với các tên như số nguyên? như tài liệu tham khảo.
Ai đó đưa JSON vào JSON của bạn
Thật nực cười nhưng nó xảy ra - có JSON được mã hóa dưới dạng một chuỗi trong JSON của bạn. Giải mã, truy cập chuỗi như bình thường, giải mã điều đó và cuối cùng nhận được những gì bạn cần.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';
$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);
echo $toppings[0]->type; //Glazed
Dữ liệu không vừa trong bộ nhớ
Nếu JSON của bạn quá lớn json_decode()
để xử lý ngay lập tức, mọi thứ bắt đầu trở nên khó khăn. Xem:
Cách sắp xếp nó
Xem: Tham khảo: tất cả các cách cơ bản để sắp xếp mảng và dữ liệu trong PHP .