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?
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źć:
- Skalary: struny, ints, floats , And bools
- nulls (specjalny typ jej własne)
- typy złożone: obiekty i tablice.
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:
- JSON składa się wyłącznie z tego,
null
. - JSON jest nieprawidłowy-sprawdź wynik
json_last_error_msg
albo przełożyć przez coś w rodzaju JSONLint . - 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()
.
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.
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łowyjson
w przeciwnym razie zwróciNULL
. - 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ść, lubjson_decode
może wystąpić błąd i po prostu zwrócić wartośćNULL
.
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