Jak wyodrębnić dane z JSON za pomocą PHP?
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
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źć:
- skalary: stringi , ints , floats i bools
- wartości null (własny specjalny typ)
- typy złożone: obiekty i tablice .
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 true
jako 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ż:
- JSON składa się w całości z tylko, że
null
. - JSON jest nieprawidłowy - sprawdź wynik
json_last_error_msg
lub prześlij go przez coś takiego jak JSONLint . - 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 .
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_decode
wymaga, aby ciąg był prawidłowyjson
, w przeciwnym razie zwróciNULL
.- W przypadku niepowodzenia dekodowania
json_last_error()
może służyć do określenia dokładnego charakteru błędu. - Upewnij się, że przekazujesz
utf8
treść, w przeciwnym raziejson_decode
możesz się pomylić i po prostu zwrócićNULL
wartość.
// 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>";
}
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
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 XPath
dla XML
zaczniesz kochać tego podejścia.