To ma być ogólne pytanie referencyjne i odpowiedź na wiele niekończących się pytań „Jak uzyskać dostęp do danych w moim JSON?” pytania. Służy tutaj do obsługi szerokich podstaw 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 zdekodować to w PHP i uzyskać dostęp do danych wynikowych?
Odpowiedzi:
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()
.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
.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]
.Iteruj po nim
foreach
.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
.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']
.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.Wydruki
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()
:i sprawdź wyjście:
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()
:Spójrz na to w tym poręcznym interaktywnym eksploratorze JSON .
Rozłóż problem na kawałki, które łatwiej owinąć głowę.
json_decode()
zwrotynull
Dzieje się tak, ponieważ:
null
.json_last_error_msg
lub przeprowadź go przez coś takiego jak JSONLint .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ć.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.
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 .
źródło
Możesz użyć json_decode () do konwersji łańcucha json na obiekt / tablicę PHP.
Na przykład.
Wejście:
Wynik:
Kilka punktów do zapamiętania:
json_decode
wymaga, aby ciąg był poprawnyjson
, w przeciwnym razie zostanie zwróconyNULL
.json_last_error()
można użyć do ustalenia dokładnej natury błędu.utf8
treść, ponieważjson_decode
może to spowodować błąd i po prostu zwrócićNULL
wartość.źródło
źródło
Możemy dekodować 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ę
źródło
Rozważ użycie
JSONPath
https://packagist.org/packages/flow/jsonpathIstnieje dość jasne wyjaśnienie, jak z niego korzystać i parsować plik JSON, unikając wszystkich proponowanych pętli . Jeśli znasz się
XPath
naXML
tym, zaczniesz kochać to podejście.źródło
Napisałem pakiet o nazwie
JSON
( GitHub , Packagist ). Jeśli chcesz uniknąć ogólnych kosztów korzystaniajson_*
funkcji, powinieneś spróbować.Przykład
Zobacz wiki lub szybki samouczek, aby się z nią zapoznać.
Ponadto, jeśli chcesz odczytać pliki JSON i wyodrębnić ich dane (wydaje się, że próbujesz to wykonać), zobacz pakiet JSONFile , który również go napisałem.
źródło
https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w
Sprawdź poniższy kod do konwersji jsona na tablicę.
PHP
Jeśli JSON jest poprawny, tojson_decode()
działa dobrze i zwróci tablicę, ale jeśli źle sformułowany JSON, to zwróciNULL
,Jeśli zniekształcony JSON i oczekujesz tylko tablicy, możesz użyć tej funkcji,
Jeśli zniekształcony JSON i chcesz zatrzymać wykonywanie kodu, możesz użyć tej funkcji,
Możesz użyć dowolnej funkcji zależnej od wymagań,
źródło