Wprowadzenie
Po pierwsze masz ciąg. JSON nie jest tablicą, obiektem ani strukturą danych. JSON to tekstowy format serializacji - więc wymyślny ciąg, ale wciąż tylko ciąg. Dekoduj w PHP za pomocą json_decode()
.
$data = json_decode($json);
Możesz tam znaleźć:
Są to rzeczy, które można zakodować w JSON. Lub dokładniej, są to wersje PHP, które można zakodować w 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 uzyskuje się w taki sam sposób, jak w przypadku publicznych niestatycznych właściwości 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 odbywa się 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
Iteruj po nim foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Przeszklone
czekolady kropi
Klon
Lub zadzieraj z dowolną z wbudowanych funkcji tablicowych bazillionu .
Dostęp do zagnieżdżonych elementów
Właściwości obiektów i elementów tablic mogą być większą liczbą obiektów i / lub tablic - możesz po prostu nadal uzyskiwać 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 ()
Gdy to zrobisz, zamiast obiektów otrzymasz tablice asocjacyjne - tablice z ciągami znaków dla 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
Dostęp do elementów tablicy asocjacyjnej
Podczas dekodowania obiektu JSON na asocjacyjną tablicę PHP można 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ść paska”
Wartość klucza „baz” to „wartość bazy”
Nie wiem, jak uporządkowane są dane
Przeczytaj dokumentację dotyczącą tego, co otrzymujesz JSON.
Spójrz na JSON - tam gdzie nawiasy klamrowe {}
oczekują 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 macie 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
)
Spójrz na to w tym poręcznym interaktywnym eksploratorze JSON .
Rozłóż problem na kawałki, które łatwiej 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 przeprowadź go przez coś takiego jak JSONLint .
- Zawiera elementy zagnieżdżone na głębokości ponad 512 poziomów. Ta domyślna maksymalna głębokość może zostać zastąpiona przez przekazanie liczby całkowitej jako trzeciego argumentu 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, w której pytasz, 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 dosłownym identyfikatorze. 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 masz liczbę całkowitą jako właściwość, 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 niedorzeczne, ale się zdarza - JSON jest zakodowany jako ciąg znaków w twoim JSON. 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ć, sprawy stają się trudne. Widzieć:
Jak to posortować
Zobacz: Materiały referencyjne: wszystkie podstawowe sposoby sortowania tablic i danych w PHP .