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

Mar 28 2015

To ma być ogólne pytanie referencyjne i odpowiedź obejmujące wiele z niekończących się pytań „Jak uzyskać dostęp do danych w moim formacie JSON?” pytania. Jest tutaj, aby zająć się podstawami dekodowania JSON w PHP i uzyskiwaniem 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 zdekodować to w PHP i uzyskać dostęp do wynikowych danych?

Odpowiedzi

460 user3942918 Mar 28 2015 at 02:38

Intro

Po pierwsze masz sznurek. JSON nie jest tablicą, obiektem ani strukturą danych. JSON to format serializacji oparty na tekście - więc fantazyjny ciąg, ale nadal tylko ciąg. Zdekoduj go w PHP przy użyciu json_decode().

 $data = json_decode($json);

Tam możesz znaleźć:

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

Nie ma w nich nic specjalnego. Nie są to „obiekty JSON” ani „tablice JSON”. Odszyfrowałeś JSON - masz teraz podstawowe, codzienne typy PHP .

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


Dostęp do właściwości obiektu

Dostęp do właściwości jednego z tych obiektów uzyskujesz w taki sam sposób, jak w przypadku 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

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

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

$toppings = json_decode($json);

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

Powtórz to za pomocą foreach.

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

Glazurowana
czekolada z posypką
klonową

Albo majstrować przy dowolnej z bazillionów wbudowanych funkcji tablicowych .


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

Właściwości obiektów i elementów tablic mogą być większymi obiektami i / lub tablicami - możesz po prostu kontynuować dostęp do ich właściwości i elementów, jak 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

Przekazywanie truejako drugi argument do json_decode ()

Kiedy to zrobisz, zamiast obiektów otrzymasz tablice asocjacyjne - tablice z ciągami znaków dla kluczy. Ponownie uzyskujesz dostęp do jego 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

Dostęp do elementów tablicy asocjacyjnej

Dekodując obiekt JSON do asocjacyjnej tablicy PHP, możesz iterować zarówno klucze, jak i wartości, używając foreach (array_expression as $key => $value)składni, np.

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

Wydruki

Wartość klucza „foo” to „wartość foo”
. Wartość klucza „bar” to „wartość baru”
. Wartość klucza „baz” to „wartość baz”


Nie wiem, jaka jest struktura danych

Przeczytaj dokumentację dotyczącą tego, z czego otrzymujesz JSON.

Spójrz na JSON - gdzie widzisz nawiasy klamrowe {}oczekujące obiektu, a 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żna uzyskać tylko tak daleko, zanim można się zgubić - iść tak daleko, a hitem , który z print_r():

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

Przyjrzyj się temu w tym poręcznym, interaktywnym eksploratorze JSON .

Podziel problem na części, które łatwiej będzie ci owinąć głową.


json_decode() zwroty null

Dzieje się tak, ponieważ:

  1. JSON składa się w całości z tylko, że null.
  2. JSON jest nieprawidłowy - sprawdź wynik json_last_error_msglub prześlij go przez coś takiego jak JSONLint .
  3. Zawiera elementy zagnieżdżone na głębokości ponad 512 poziomów. Tę 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 niewłaściwy problem. Dowiedz się, dlaczego otrzymujesz tak głęboko zagnieżdżone dane (np. Usługa, do której wysyłasz zapytanie, która generuje JSON, ma błąd) i spraw, aby tak się nie stało.


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

Czasami będziesz mieć nazwę właściwości obiektu, która zawiera coś w rodzaju łącznika -lub znaku, @którego nie można użyć w identyfikatorze literału. Zamiast tego możesz użyć literału ciągu w nawiasach klamrowych, aby go rozwiązać.

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

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

Jeśli jako właściwość masz liczbę całkowitą, zobacz: Jak uzyskać dostęp do właściwości obiektu o nazwach takich jak liczby całkowite? jako odniesienie.


Ktoś umieścił JSON w twoim JSON

To śmieszne, ale zdarza się - w Twoim JSON jest kod JSON jako ciąg znaków. Decode, dostęp ciąg jak zwykle, dekodowania , że i ostatecznie dostać się do 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()go obsłużyć od razu, sprawy zaczynają się komplikować. Widzieć:


Jak to posortować

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

19 MohdAbdulMujib Oct 26 2016 at 20:24

Możesz użyć json_decode (), aby przekonwertować ciąg json na obiekt / tablicę PHP.

Na przykład.

Wejście:

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

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

Wynik:

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_decodewymaga, aby ciąg był prawidłowy json, w przeciwnym razie zwróci NULL.
  • W przypadku niepowodzenia dekodowania json_last_error()może służyć do określenia dokładnego charakteru błędu.
  • Upewnij się, że przekazujesz utf8treść, w przeciwnym razie json_decodemożesz się pomylić i po prostu zwrócić NULLwartość.
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

Możemy zdekodować ciąg json do tablicy za pomocą funkcji json_decode w php

1) json_decode ($ json_string) // zwraca obiekt

2) json_decode ($ json_string, true) // zwraca tablicę

$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

Rozważ użycie JSONPath https://packagist.org/packages/flow/jsonpath

Istnieje dość jasne wyjaśnienie, jak go używać i analizować plik JSON, unikając wszystkich proponowanych pętli . Jeśli jesteś zaznajomiony z XPathdla XMLzaczniesz kochać tego podejścia.