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

229
user3942918 2015-03-28 09:38.

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

5 answers

460
user3942918 2015-03-28 09: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: Làm cách nào để sắp xếp các mảng và dữ liệu trong PHP? .

19
Mohd Abdul Mujib 2016-10-27 03: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
Sayeed amin 2019-11-07 02: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
Kankatala Krishna 2019-08-06 20: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
0
Paul Burilichev 2020-01-23 04: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.

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Trong Saturday Night Live, The Bachelor is Bland và Tina Fey trở lại với vai 'Crazy' Sarah Palin

Trong Saturday Night Live, The Bachelor is Bland và Tina Fey trở lại với vai 'Crazy' Sarah Palin

Sau khi Sarah Palin tán thành Donald Trump vào đầu tuần này, gần như không thể tránh khỏi việc Tina Fey sẽ trở lại Saturday Night Live để thăm lại ấn tượng Palin cổ điển của cô. Và Fey chắc chắn đã không làm thất vọng, cô ấy đã đưa ra một lời khen ngợi không hề nhẹ về bài phát biểu chứng thực Iowa quanh co và khó hiểu của Palin trong khi Trump của Darrell Hammond đưa ra bình luận xuyên suốt.

Đây có phải là sự khởi đầu cho sự kết thúc của việc giam giữ Brittney Griner?

Đây có phải là sự khởi đầu cho sự kết thúc của việc giam giữ Brittney Griner?

Brittney Griner (r.) Ngay từ đầu, thân phận của Brittney Griner đã là tình huống con tin Mỹ độc nhất trong lịch sử hiện đại.

Tom Brady là bộ tứ vệ đầu tiên cuối cùng có thể giúp Julio Jones có hơn 10 lần chạm bóng trong một mùa giải

Tom Brady là bộ tứ vệ đầu tiên cuối cùng có thể giúp Julio Jones có hơn 10 lần chạm bóng trong một mùa giải

Chúng ta có thể thấy nhiều hơn nữa về một Julio Jones khỏe mạnh trong khu vực cuối năm nay. John Parker Wilson, Greg McElroy, A.

Đó phải là Đức

Đó phải là Đức

Đối với đội tuyển Anh, không có kẻ thủ ác nào lớn hơn Hầu hết các cổ động viên Anh, nếu không muốn nói là tất cả, hẳn sẽ phải gật gù khi tiếng còi mãn cuộc của trận bán kết lượt về W Euro 2022 vang lên. Bởi vì nó báo hiệu rằng Đức sẽ chờ đợi ở Wembley trong trận chung kết với Anh và là điều duy nhất giữa Anh và chiếc cúp lớn đầu tiên của đội tuyển nữ.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language