Jak wyodrębnić dane z JSON za pomocą PHP?

Ma to być ogólne Pytanie referencyjne i odpowiedź obejmująca wiele niekończących się "Jak uzyskać dostęp do danych w moim JSON?" pytania. Jest tutaj, aby zająć się szerokimi podstawami dekodowania JSON w PHP i uzyskiwania dostępu do wyników.

Mam JSON:

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

Jak to rozkodować w PHP i uzyskać dostęp do danych wynikowych?

 153
Author: Paul Crovella, 2015-03-27

2 answers

Intro

Po pierwsze masz sznurek. JSON nie jest tablicą, obiektem ani strukturą danych. JSON jest formatem serializacji tekstowej - więc fantazyjny ciąg znaków, ale wciąż tylko ciąg znaków. Dekodowanie w PHP za pomocą json_decode().
 $data = json_decode($json);

W nim możesz znaleźć:

To są rzeczy, które można zakodować w JSON. A dokładniej, są to wersje PHP rzeczy, które można zakodować w JSON.

Nie ma w nich nic specjalnego. Nie są to "obiekty JSON" ani " tablice JSON."Zdekodowałeś JSON - teraz masz podstawowe typy PHP .

Obiekty będą instancjami stdClass , wbudowanej klasy, która jest tylko ogólna rzecz to nie jest tutaj ważne.


dostęp do Właściwości obiektu

Uzyskujesz dostęp do właściwości jednego z tych obiektów w taki sam sposób, jak dla publicznych właściwości niestatycznych dowolnego innego obiektu, np. $object->property.

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

$yummy = json_decode($json);

echo $yummy->type; //donut

dostęp do elementów tablicy

Uzyskujesz dostęp do elementów jednej z tych tablic w taki sam sposób, jak dla każdej innej tablicy, np. $array[0].

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

$toppings = json_decode($json);

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

Iterate over it with foreach.

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

Szkliwione
Czekolada z posypką
Klon

Lub bałaganu z którąkolwiek z wbudowanych funkcji tablicy .


dostęp do zagnieżdżonych elementów

Właściwości obiektów i elementów tablic mogą być więcej obiektów i / lub tablic - możesz po prostu kontynuować dostęp do ich właściwości i członków jako Zwykle, np. $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

podanie true jako drugiego argumentu do json_decode()

Gdy to zrobisz, zamiast obiektów otrzymasz tablice asocjacyjne - tablice z łańcuchami kluczy. Ponownie uzyskujesz dostęp do ich elementów jak zwykle, np. $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

Nie wiem, w jaki sposób dane są strukturyzowane

Przeczytaj dokumentację tego, z czego otrzymujesz JSON.

Spójrz na JSON-gdzie widzisz nawiasy klamrowe {} oczekuj obiektu, gdzie widzisz nawiasy kwadratowe [] oczekuj tablicy.

Uderz w zdekodowane dane za pomocą 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);

I sprawdź wyjście:

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
                )

        )

)

Powie Ci, gdzie masz obiekty, gdzie masz tablice, wraz z nazwami i wartościami ich członków.

Jeśli możesz tylko dostać się tak daleko, zanim się zgubisz-idź tak daleko i uderz , że z print_r():

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

Break the problem w dół na kawałki, które są łatwiejsze do owinąć głowę wokół.


json_decode() zwroty null

Dzieje się tak, ponieważ albo:

  1. JSON składa się wyłącznie z tego, null.
  2. JSON jest nieprawidłowy-sprawdź wynik json_last_error_msg albo przełożyć przez coś w rodzaju JSONLint .
  3. zawiera elementy zagnieżdżone na ponad 512 poziomach. Domyślną maksymalną głębokość można przesłonić, przekazując liczbę całkowitą jako trzeci argument do json_decode().
Jeśli chcesz zmienić maksymalną głębokość, prawdopodobnie rozwiązujesz zły problem. Dowiedz się, dlaczego dostajesz tak głęboko zagnieżdżone dane (np. usługa, której szukasz, generująca JSON ma błąd) i upewnij się, że tak się nie dzieje.

nazwa właściwości obiektu zawiera znak specjalny

Czasami masz nazwę właściwości obiektu, która zawiera coś w rodzaju myślnika - lub znaku @ który nie może być użyty w dosłownym identyfikatorze. Zamiast tego możesz użyć literału w nawiasach klamrowych, aby go zaadresować.

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

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

Jeśli masz właściwość integer as zobacz: jak uzyskać dostęp do Właściwości obiektu z nazwami takimi jak liczby całkowite? jako odniesienie.


ktoś wrzucił JSON do twojego JSON

To śmieszne, ale zdarza się - w Twoim JSON jest JSON zakodowany jako ciąg znaków. Dekodowanie, dostęp do łańcucha jak zwykle, dekodowanie że , a w końcu idź do tego, czego potrzebujesz.

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

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

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

dane nie mieszczą się w pamięci

Jeśli twój JSON jest zbyt duży, aby json_decode() poradzić sobie od razu, rzeczy zaczynają być trudne. Zobacz:


Jak to sortować

Zobacz: odniesienie: wszystkie podstawowe sposoby sortowania tablic i danych w PHP.

 306
Author: Paul Crovella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 23:00:09

Możesz użyć json_decode() Aby przekonwertować łańcuch json na obiekt/tablicę PHP.

Np.

Input:

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

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

Wyjście:

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

Kilka punktów do zapamiętania:

  • json_decode wymaga, aby łańcuch był prawidłowy json w przeciwnym razie zwróci NULL.
  • W przypadku braku dekodowania, json_last_error() może być użyty do określenia dokładnej natury błędu.
  • upewnij się, że przekazujesz utf8 treść, lub json_decode może wystąpić błąd i po prostu zwrócić wartość NULL.
 8
Author: Mohd Abdul Mujib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-26 13:24:54