Làm cách nào để trích xuất dữ liệu từ JSON với PHP?

Mar 28 2015

Đâ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

460 user3942918 Mar 28 2015 at 02:38

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:

Đâ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 truelà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ì:

  1. JSON hoàn toàn chỉ bao gồm điều đó null,.
  2. JSON không hợp lệ - hãy kiểm tra kết quả của json_last_error_msghoặc đặt nó thông qua một cái gì đó như JSONLint .
  3. 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 .

19 MohdAbdulMujib Oct 26 2016 at 20:24

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_decodeyêu cầu chuỗi phải hợp lệ jsonnế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 utf8nội dung vào , nếu không json_decodecó thể bị lỗi và chỉ trả về một NULLgiá trị.
2 Sayeedamin Nov 06 2019 at 19:31
// 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>";
}
1 KankatalaKrishna Aug 06 2019 at 13:08

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
PaulBurilichev Jan 22 2020 at 21:48

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 XPathcho XMLbạn sẽ bắt đầu yêu thương cách tiếp cận này.