Làm cách nào để trích xuất dữ liệu từ JSON với PHP?
Đây là một câu hỏi và câu trả lời tham khảo chung bao gồm nhiều câu "Làm cách nào để truy cập dữ liệu trong JSON của tôi?" các câu hỏi. Nó ở đây để xử lý các khái niệm cơ bản về giải mã JSON trong PHP và truy cập kết quả.
Tôi có JSON:
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
Làm cách nào để giải mã điều này trong PHP và truy cập vào dữ liệu kết quả?
Trả lời
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 một 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 một chuỗi lạ mắt, nhưng vẫn chỉ là một chuỗi. Giải mã nó bằng PHP bằng cách sử dụng json_decode()
.
$data = json_decode($json);
Ở đó bạn có thể tìm thấy:
- vô hướng: chuỗi , ints , float và bools
- nulls (một loại đặc biệt của riêng nó)
- kiểu phức hợp: đối tượng và mảng .
Đâ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 PHP của những thứ có thể được mã hóa bằng 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 sẵn chỉ là một thứ chung 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 những đối tượng này giống như cách bạn làm đối với các thuộc tính không tĩnh công cộng 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 vào các yếu tố của một trong những mảng giống như cách bạn sẽ cho bất kỳ mảng khác, ví dụ như $array[0]
.
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
Lặp lại nó với foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Sô cô la tráng men với rắc
Maple
Hoặc lộn xộn với bất kỳ hàm mảng tích hợp bazillion 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 phần tử của mảng có thể là nhiều đối tượng và / hoặc mảng hơn - bạn có thể chỉ cần tiếp tục truy cập các thuộc tính và thành viên của chúng như bình thường, chẳng hạn $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 liên kết - mảng có các chuỗi cho các khóa. Một lần nữa bạn truy cập vào các yếu tố đó như thường lệ, 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 liên kết, 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, ví dụ:
$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 để biết bất cứ điều gì bạn đang lấy 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 vào 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ể tiến xa đến đó trước khi bị lạc - hãy đi xa đến đó và đạt được điều đó với print_r()
:
print_r($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
Hãy xem nó trong trình khám phá JSON tương tác hữu ích này .
Hãy chia nhỏ vấn đề thành nhiều phần dễ hiểu hơn.
json_decode()
trả lại null
Điều này xảy ra bởi vì:
- JSON hoàn toàn chỉ bao gồm điều đó
null
,. - JSON không hợp lệ - hãy kiểm tra kết quả của
json_last_error_msg
hoặc đặt nó thông qua một cái gì đó như JSONLint . - Nó chứa các phần tử được lồng 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ó thể 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à đ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 chứa một cái gì đó giống như dấu gạch ngang -
hoặc dấu @
không thể được sử dụng trong định danh theo nghĩa đen. Thay vào đó, bạn có thể sử dụng một chuỗi ký tự trong 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 có tên như số nguyên? như tài liệu tham khảo.
Ai đó đã đặt JSON vào JSON của bạn
Thật nực cười nhưng nó vẫn xảy ra - có JSON được mã hóa thành 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ã chuỗi đó và cuối cùng đến được thứ 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 để có json_decode()
thể xử lý ngay lập tức, mọi thứ bắt đầu trở nên phức tạp. Xem:
Làm thế nào để 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 .
Bạn có thể sử dụng json_decode () để chuyển đổi một chuỗi json thành một đối tượng / mảng PHP.
Ví dụ.
Đầu vào:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
Đầu ra:
object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
Vài điểm cần nhớ:
json_decode
yêu cầu chuỗi phải hợp lệjson
nếu không nó sẽ trả vềNULL
.- Trong trường hợp không giải mã được,
json_last_error()
có thể được sử dụng để xác định bản chất chính xác của lỗi. - Đảm bảo bạn chuyển
utf8
nội dung vào , nếu khôngjson_decode
có thể bị lỗi và chỉ trả về mộtNULL
giá trị.
// Using json as php array
$json = '[{"user_id":"1","user_name":"Sayeed Amin","time":"2019-11-06 13:21:26"}]';
//or use from file
//$json = file_get_contents('results.json');
$someArray = json_decode($json, true);
foreach ($someArray as $key => $value) {
echo $value["user_id"] . ", " . $value["user_name"] . ", " . $value["time"] . "<br>";
}
Chúng ta có thể giải mã chuỗi json thành mảng bằng cách sử dụng hàm json_decode trong php
1) json_decode ($ json_string) // nó trả về đối tượng
2) json_decode ($ json_string, true) // nó trả về mảng
$json_string = '{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$array = json_decode($json_string,true);
echo $array['type']; //it gives donut
Cân nhắc sử dụng JSONPath
https://packagist.org/packages/flow/jsonpath
Có một lời giải thích khá rõ ràng về cách sử dụng nó và phân tích cú pháp tệp JSON tránh tất cả các vòng lặp được đề xuất. Nếu bạn đã quen thuộc với XPath
cho XML
bạn sẽ bắt đầu yêu thương cách tiếp cận này.