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


214

Đây được dự định là một câu hỏi và câu trả lời tham khảo chung bao gồm nhiều câu hỏi không bao giờ kết thúc "Làm cách nào để tôi truy cập dữ liệu trong JSON của mình?" câu hỏi Đây là nơi để xử lý các vấn đề cơ bản về giải mã JSON trong PHP và truy cập các 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 thế nào để tôi giải mã điều này trong PHP và truy cập dữ liệu kết quả?



Xin vui lòng tôi có thể biết rằng tại sao câu hỏi này không được coi là một câu hỏi trùng lặp ngay cả 9 hoặc ít hơn người dùng được đánh dấu là trùng lặp cho stackoverflow.com/questions/4343596/parsing-json-file-with-php ? M
Tôi là người ngu ngốc nhất

@IamtheMostStoolPerson Tôi sẽ cố gắng giải thích, mặc dù tên người dùng của bạn khiến tôi nghi ngờ bạn sẽ nhận được nó;). Câu hỏi này được hỏi, và câu trả lời của nó được viết, theo cách "kinh điển". Như vậy, đó là một người nhận tốt hơn cho mục tiêu trùng lặp so với các câu hỏi khác.
Félix Gagnon-Grenier

Câu trả lời:


428

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 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 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 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ì:

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


chỉ vấp phải câu trả lời này và thấy rằng liên kết đến mảng.include-once.org bị hỏng.
Jeff

@Jeff Cảm ơn. Xấu hổ về điều đó. Tôi đã xóa liên kết.
dùng3942918

vâng, xem xét tên của liên kết và cách bạn mô tả nó, nó nghe giống như một người lập dị thực sự.
Jeff

điều duy nhất giải pháp này thiếu là làm thế nào để trích xuất dữ liệu từ một tệp json khác. Tôi muốn giới thiệu, solutuon này: stackoverflow.com/questions/19758954/NH
Ishan Srivastava

Điều đó thật tuyệt. Cảm ơn bạn.
David Kariuki

17

Bạn có thể sử dụng json_decode () để chuyển đổi chuỗi json thành đố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.
  • Hãy chắc chắn rằng bạn chuyển utf8nội dung, hoặc json_decodecó thể lỗi và chỉ trả về một NULLgiá trị.

tốt, dù sao họ có thể không thích sự đơn giản của nó. Bạn luôn có thể nâng cấp;)
Mohd Abdul Mujib

1
Có lẽ lý do rất có thể là nó đã được trả lời và có vẻ như @MohdAbdulMujib đang ở sau một số đại diện miễn phí
Isaac

3
@Isaac một số người có thể không thích đọc toàn bộ hướng dẫn khi họ chỉ muốn bắt đầu sử dụng chức năng. Nếu không, họ nên đọc tài liệu chính thức. Điểm chung của SO là sự đơn giản trong đó các câu trả lời được cung cấp. IMHO
Mohd Abdul Mujib

3
// 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

Chúng ta có thể giải mã chuỗi json thành mảng bằng hàm json_decode trong php

1) json_decode ($ json_opes) // nó trả về đối tượng

2) json_decode ($ json_opes, 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

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


-1

Tôi đã viết một gói có tên JSON( GitHub , Packagist ). Nếu bạn muốn ngăn chặn chi phí sử dụngjson_* chức năng, bạn nên thử nó.

Thí dụ

use MAChitgarha\Component\JSON;

$jsonStr = <<<JSON
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}
JSON;

// Create an instance
$json = new JSON($jsonStr);

// Get a nested element using dots
$json->get("toppings.1.type"); // Chocolate with Sprinkles
$json["toppings.1.type"]; // Chocolate with Sprinkles

// Iterate over an element
foreach ($json->iterate("toppings") as $item)
    echo "{$item->id}: {$item->type}", PHP_EOL;

// Change an element
$json->set("toppings.3", [
    "id" => "5000",
    "type" => "Unknown"
]);

// Get data as JSON string, array or object, respectively
$json->getDataAsJson();
$json->getDataAsArray();
$json->getDataAsObject();

Xem wiki hoặc hướng dẫn nhanh để làm quen với nó.

Hơn nữa, nếu bạn muốn đọc các tệp JSON và trích xuất dữ liệu của nó (vì có vẻ như bạn đang cố gắng thực hiện việc này), hãy xem gói JSONFile mà tôi cũng đã viết nó.


-2

https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w

Kiểm tra mã bên dưới để chuyển đổi json thành mảng PHP, Nếu JSON đúng thì json_decode()hoạt động tốt và sẽ trả về một mảng, nhưng nếu JSON không đúng định dạng, thì nó sẽ trả về NULL,

<?php
function jsonDecode1($json){
    $arr = json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );

Nếu JSON không đúng định dạng và bạn chỉ mong đợi mảng, thì bạn có thể sử dụng hàm này,

<?php
function jsonDecode2($json){
    $arr = (array) json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );

Nếu JSON không đúng định dạng và bạn muốn dừng thực thi mã, thì bạn có thể sử dụng chức năng này,

<?php
function jsonDecode3($json){
    $arr = (array) json_decode($json, true);

    if(empty(json_last_error())){
        return $arr;
    }
    else{
        throw new ErrorException( json_last_error_msg() );
    }
}

// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );

Bạn có thể sử dụng bất kỳ chức năng nào tùy thuộc vào yêu cầu của bạn,

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.