Bagaimana cara mengekstrak data dari JSON dengan PHP?

214

Ini dimaksudkan sebagai pertanyaan dan jawaban referensi umum yang mencakup banyak pertanyaan "Bagaimana cara mengakses data di JSON saya?" pertanyaan. Di sinilah untuk menangani dasar-dasar luas mendekode JSON dalam PHP dan mengakses hasilnya.

Saya punya JSON:

{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}

Bagaimana cara memecahkan kode ini dalam PHP dan mengakses data yang dihasilkan?

pengguna3942918
sumber
1
Terkait: Mampu melihat variabel dalam output print_r (), tetapi tidak yakin bagaimana mengaksesnya dalam kode , eksplorasi JSON interaktif dalam konteks PHP dimungkinkan di sini: array.include-once.org
hakre
Tolong bisakah saya tahu bahwa mengapa pertanyaan ini tidak dianggap sebagai pertanyaan rangkap meskipun 9 atau kurang pengguna ditandai sebagai rangkap untuk stackoverflow.com/questions/4343596/parsing-json-file-with-php ? M
Saya Orang yang Paling Bodoh
@IamtheMostStupidPerson Saya akan mencoba menjelaskan, meskipun nama pengguna Anda membuat saya ragu Anda akan mendapatkannya;). Pertanyaan ini diajukan, dan jawabannya ditulis, dengan cara "kanonik". Dengan demikian, ini adalah penerima yang lebih baik untuk target duplikat daripada pertanyaan lain.
Félix Gagnon-Grenier

Jawaban:

428

Intro

Pertama, Anda memiliki string. JSON bukan array, objek, atau struktur data. JSON adalah format serialisasi berbasis teks - jadi string yang mewah, tetapi masih hanya string. Dekode dalam PHP dengan menggunakan json_decode().

 $data = json_decode($json);

Di sana Anda mungkin menemukan:

Ini adalah hal-hal yang dapat dikodekan dalam JSON. Atau lebih tepatnya, ini adalah versi PHP dari hal-hal yang dapat dikodekan dalam JSON.

Tidak ada yang spesial dari mereka. Mereka bukan "objek JSON" atau "array JSON." Anda telah mendekodekan JSON - Anda sekarang memiliki tipe PHP harian dasar .

Objek akan menjadi instance dari stdClass , kelas bawaan yang hanya merupakan hal umum yang tidak penting di sini.


Mengakses properti objek

Anda mengakses properti dari salah satu objek ini dengan cara yang sama seperti yang Anda lakukan untuk properti non-statis publik dari objek lain, misalnya $object->property.

$json = '
{
    "type": "donut",
    "name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut

Mengakses elemen array

Anda mengakses elemen-elemen dari salah satu array ini dengan cara yang sama Anda lakukan untuk array lain, misalnya $array[0].

$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles

Iterate dengan itu foreach.

foreach ($toppings as $topping) {
    echo $topping, "\n";
}


Cokelat Glazed dengan Taburan
Maple

Atau mengacaukan dengan salah satu dari fungsi bazillion built-in array .


Mengakses item yang bersarang

Properti objek dan elemen array mungkin lebih banyak objek dan / atau array - Anda dapat terus mengakses properti dan anggotanya seperti biasa, misalnya $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

Berlalu truesebagai argumen kedua ke json_decode ()

Ketika Anda melakukan ini, alih-alih objek Anda akan mendapatkan array asosiatif - array dengan string untuk kunci. Sekali lagi Anda mengakses elemen-elemennya seperti biasa, mis $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

Mengakses item array asosiatif

Saat mendekode objek JSON ke array PHP asosiatif, Anda dapat mengulangi kedua kunci dan nilai menggunakan foreach (array_expression as $key => $value)sintaks, misalnya

$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;
}

Cetakan

Nilai kunci 'foo' adalah 'nilai foo'
Nilai kunci 'bar' adalah 'nilai bar'
Nilai kunci 'baz' adalah 'nilai baz'


Tidak tahu bagaimana data disusun

Baca dokumentasi untuk apa pun yang Anda dapatkan dari JSON.

Lihatlah JSON - di mana Anda melihat kurung keriting {}mengharapkan objek, di mana Anda melihat kurung siku []mengharapkan array.

Memukul data yang diterjemahkan dengan 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);

dan periksa hasilnya:

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
                )

        )

)

Ini akan memberi tahu Anda di mana Anda memiliki objek, di mana Anda memiliki array, bersama dengan nama dan nilai anggota mereka.

Jika Anda hanya bisa mendapatkan begitu jauh ke dalamnya sebelum Anda tersesat - pergi yang jauh dan hit yang dengan print_r():

print_r($yummy->toppings[0]);
stdClass Object
(
    [id] => 5002
    [type] => Glazed
)

Lihatlah di penjelajah JSON interaktif yang praktis ini .

Pecahkan masalah menjadi beberapa bagian yang lebih mudah untuk dililitkan.


json_decode() kembali null

Ini terjadi karena:

  1. JSON seluruhnya terdiri dari hanya itu null,.
  2. JSON tidak valid - periksa hasil json_last_error_msgatau masukkan melalui sesuatu seperti JSONLint .
  3. Ini berisi elemen bersarang lebih dari 512 level. Kedalaman maks standar ini dapat diganti dengan melewatkan bilangan bulat sebagai argumen ketiga json_decode().

Jika Anda perlu mengubah kedalaman maks Anda mungkin memecahkan masalah yang salah. Cari tahu mengapa Anda mendapatkan data yang sangat bersarang (mis. Layanan yang Anda tanyakan yang menghasilkan JSON memiliki bug) dan jangan sampai hal itu terjadi.


Nama properti objek berisi karakter khusus

Terkadang Anda akan memiliki nama properti objek yang berisi sesuatu seperti tanda hubung -atau tanda @yang tidak dapat digunakan dalam pengidentifikasi literal. Sebagai gantinya Anda dapat menggunakan string literal dalam kurung kurawal untuk mengatasinya.

$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42

Jika Anda memiliki integer sebagai properti, lihat: Bagaimana cara mengakses properti objek dengan nama seperti integer? sebagai referensi.


Seseorang memasukkan JSON ke JSON Anda

Ini konyol tapi itu terjadi - ada JSON yang disandikan sebagai string di dalam JSON Anda. Decode, akses string seperti biasa, decode itu , dan akhirnya dapatkan apa yang Anda butuhkan.

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';

$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);

echo $toppings[0]->type; //Glazed

Data tidak muat di memori

Jika JSON Anda terlalu besar untuk json_decode()ditangani sekaligus, semuanya menjadi rumit. Lihat:


Cara mengatasinya

Lihat: Referensi: semua cara dasar untuk mengurutkan array dan data dalam PHP .

pengguna3942918
sumber
baru saja tersandung pada jawaban ini dan menemukan bahwa tautan ke array.include-once.org rusak.
Jeff
@ Jeff Terima kasih. Malu tentang itu. Saya telah menghapus tautannya.
user3942918
ya, mengingat nama tautan dan bagaimana Anda menggambarkannya, itu terdengar sangat mengecewakan.
Jeff
Satu-satunya kekurangan solusi ini adalah bagaimana cara mengekstrak data dari file json lain. Saya akan merekomendasikan, solutuon ini: stackoverflow.com/questions/19758954/…
Ishan Srivastava
Ini bagus. Terima kasih.
David Kariuki
17

Anda dapat menggunakan json_decode () untuk mengubah string json menjadi objek / array PHP.

Misalnya.

Memasukkan:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

Keluaran:

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)
}

Beberapa Poin yang perlu diingat:

  • json_decodemembutuhkan string untuk menjadi valid jsonkalau tidak akan kembali NULL.
  • Dalam hal terjadi kegagalan untuk memecahkan kode, json_last_error()dapat digunakan untuk menentukan sifat kesalahan yang tepat.
  • Pastikan Anda mengirimkan utf8konten, atau json_decodemungkin kesalahan keluar dan hanya mengembalikan NULLnilai.
Mohd Abdul Mujib
sumber
Yah, mereka mungkin tidak menyukai kesederhanaannya, toh. Anda selalu dapat mendukung;)
Mohd Abdul Mujib
1
Mungkin alasan yang lebih mungkin adalah bahwa itu sudah dijawab dan sepertinya @MohdAbdulMujib mengejar beberapa rep gratis
Isaac
3
@Isaac, beberapa orang mungkin tidak terlalu tertarik membaca seluruh manual ketika mereka hanya ingin memulai dengan menggunakan fungsi. Kalau tidak, mereka akan lebih baik membaca dokumen resmi. Inti dari SO adalah kesederhanaan di mana jawaban diberikan. 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>";
}
Sayeed amin
sumber
1

Kita dapat mendekode string json ke dalam array menggunakan fungsi json_decode di php

1) json_decode ($ json_string) // ia mengembalikan objek

2) json_decode ($ json_string, true) // ia mengembalikan array

$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
Kankatala Krishna
sumber
0

Pertimbangkan untuk menggunakan JSONPath https://packagist.org/packages/flow/jsonpath

Ada penjelasan yang cukup jelas tentang cara menggunakannya dan mengurai file JSON menghindari semua loop yang diusulkan. Jika Anda sudah familiar dengan XPathuntuk XMLAnda akan mulai mencintai pendekatan ini.

Paul Burilichev
sumber
-1

Saya telah menulis paket bernama JSON( GitHub , Packagist ). Jika Anda ingin mencegah overhead menggunakan json_*fungsi, Anda harus mencobanya.

Contoh

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();

Lihat wiki , atau tutorial cepat untuk membiasakan diri dengannya.

Lebih jauh, jika Anda ingin membaca file JSON dan mengekstrak datanya (sepertinya Anda mencoba melakukan ini), lihat paket JSONFile , yang telah saya tulis juga.

MAChitgarha
sumber
-2

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

Periksa kode di bawah ini untuk mengubah json menjadi array PHP, Jika JSON benar maka json_decode()berfungsi dengan baik, dan akan mengembalikan array, Tetapi jika JSON salah format, maka akan mengembalikan 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) );

Jika JSON salah, dan Anda hanya mengharapkan array, maka Anda dapat menggunakan fungsi ini,

<?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) );

Jika JSON salah, dan Anda ingin menghentikan eksekusi kode, maka Anda dapat menggunakan fungsi ini,

<?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) );

Anda dapat menggunakan fungsi apa pun tergantung pada kebutuhan Anda,

harish sharma
sumber