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

214

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?

użytkownik3942918
źródło
1
Powiązane: Mogę zobaczyć zmienną na wyjściu print_r (), ale nie jestem pewien, jak uzyskać do niej dostęp w kodzie , interaktywna eksploracja JSON w kontekście PHP jest możliwa tutaj: array.include-once.org
hakre
Czy mogę wiedzieć, że dlaczego to pytanie nie jest uważane za duplikat, nawet 9 lub mniej użytkowników oznaczonych jako duplikat dla stackoverflow.com/questions/4343596/parsing-json-file-with-php ? M
Jestem najgłupszą osobą
@IamtheMostStupidPerson Spróbuję wyjaśnić, nawet jeśli twoja nazwa użytkownika budzi wątpliwości, że go dostaniesz;). To pytanie jest zadawane, a odpowiedzi są zapisywane w sposób „kanoniczny”. Jako taki jest lepszym odbiorcą duplikatu celu niż inne pytania.
Félix Gagnon-Grenier

Odpowiedzi:

428

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 truejako 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ż:

  1. JSON składa się w całości z tylko, że null.
  2. JSON jest nieprawidłowy - sprawdź wynik json_last_error_msglub przeprowadź go przez coś takiego jak JSONLint .
  3. 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 .

użytkownik3942918
źródło
natknąłem się na tę odpowiedź i stwierdziłem, że link do array.include-once.org jest uszkodzony.
Jeff
@Jeff Dzięki. Wstydź się z tego powodu. Usunąłem link.
user3942918
tak, biorąc pod uwagę nazwę linku i sposób, w jaki go opisałeś, brzmi to jak prawdziwy bummer.
Jeff
jedyne, czego brakuje temu rozwiązaniu, to jak wyodrębnić dane z innego pliku json. Polecam, to rozwiązanie: stackoverflow.com/questions/19758954/…
Ishan Srivastava
To jest świetne. Dziękuję Ci.
David Kariuki
17

Możesz użyć json_decode () do konwersji łańcucha 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ł poprawny json, w przeciwnym razie zostanie zwrócony NULL.
  • W przypadku niepowodzenia dekodowania json_last_error()można użyć do ustalenia dokładnej natury błędu.
  • Upewnij się, że przekazujesz utf8treść, ponieważ json_decodemoże to spowodować błąd i po prostu zwrócić NULLwartość.
Mohd Abdul Mujib
źródło
cóż, mimo wszystko mogli nie spodobać się jej prostocie. Zawsze możesz głosować;)
Mohd Abdul Mujib
1
Prawdopodobnie bardziej prawdopodobnym powodem jest to, że już na nie udzielono odpowiedzi i wygląda na to, że @MohdAbdulMujib jest po darmowym powtórzeniu
Izaak
3
@Isaac, niektórzy ludzie mogą nie być bardzo zainteresowani czytaniem całej instrukcji, gdy chcą po prostu zacząć korzystać z tej funkcji. W przeciwnym razie lepiej by było przeczytać oficjalny dokument. Istotą SO jest prostota, w której udzielane są odpowiedzi. IMHO
Mohd Abdul Mujib
3
// 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>";
}
Sayeed amin
źródło
1

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ę

$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
Kankatala Krishna
źródło
0

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

Istnieje dość jasne wyjaśnienie, jak z niego korzystać i parsować plik JSON, unikając wszystkich proponowanych pętli . Jeśli znasz się XPathna XMLtym, zaczniesz kochać to podejście.

Paul Burilichev
źródło
-1

Napisałem pakiet o nazwie JSON( GitHub , Packagist ). Jeśli chcesz uniknąć ogólnych kosztów korzystaniajson_* funkcji, powinieneś spróbować.

Przykład

use MAChitgarha\Component\JSON;

$jsonStr = <<<JSON
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}
JSON;

// Create an instance
$json = new JSON($jsonStr);

// Get a nested element using dots
$json->get("toppings.1.type"); // Chocolate with Sprinkles
$json["toppings.1.type"]; // Chocolate with Sprinkles

// Iterate over an element
foreach ($json->iterate("toppings") as $item)
    echo "{$item->id}: {$item->type}", PHP_EOL;

// Change an element
$json->set("toppings.3", [
    "id" => "5000",
    "type" => "Unknown"
]);

// Get data as JSON string, array or object, respectively
$json->getDataAsJson();
$json->getDataAsArray();
$json->getDataAsObject();

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.

MAChitgarha
źródło
-2

https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w

Sprawdź poniższy kod do konwersji jsona na tablicę. PHPJeśli JSON jest poprawny, to json_decode()działa dobrze i zwróci tablicę, ale jeśli źle sformułowany JSON, to zwróci NULL,

<?php
function jsonDecode1($json){
    $arr = json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );

Jeśli zniekształcony JSON i oczekujesz tylko tablicy, możesz użyć tej funkcji,

<?php
function jsonDecode2($json){
    $arr = (array) json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );

Jeśli zniekształcony JSON i chcesz zatrzymać wykonywanie kodu, możesz użyć tej funkcji,

<?php
function jsonDecode3($json){
    $arr = (array) json_decode($json, true);

    if(empty(json_last_error())){
        return $arr;
    }
    else{
        throw new ErrorException( json_last_error_msg() );
    }
}

// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );

Możesz użyć dowolnej funkcji zależnej od wymagań,

harish sharma
źródło