Comment extraire des données de JSON avec PHP?

Mar 28 2015

Il s'agit d'une question de référence générale et d'une réponse couvrant la plupart des interminables "Comment puis-je accéder aux données dans mon JSON?" des questions. Il est là pour gérer les bases générales du décodage JSON en PHP et accéder aux résultats.

J'ai le JSON:

{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}

Comment décoder cela en PHP et accéder aux données résultantes?

Réponses

460 user3942918 Mar 28 2015 at 02:38

Intro

Tout d'abord, vous avez une chaîne. JSON n'est pas un tableau, un objet ou une structure de données. JSON est un format de sérialisation basé sur du texte - donc une chaîne sophistiquée, mais toujours juste une chaîne. Décodez-le en PHP en utilisant json_decode().

 $data = json_decode($json);

Vous y trouverez peut-être:

Ce sont les choses qui peuvent être encodées en JSON. Ou plus précisément, ce sont les versions PHP des éléments qui peuvent être encodés en JSON.

Il n'y a rien de spécial à leur sujet. Ce ne sont pas des "objets JSON" ou des "tableaux JSON". Vous avez décodé le JSON - vous avez maintenant des types PHP de base de tous les jours .

Les objets seront des instances de stdClass , une classe intégrée qui n'est qu'une chose générique qui n'est pas importante ici.


Accéder aux propriétés des objets

Vous accédez aux propriétés de l'un de ces objets de la même manière que vous le feriez pour les propriétés publiques non statiques de tout autre objet, par exemple $object->property.

$json = '
{
    "type": "donut",
    "name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut

Accéder aux éléments du tableau

Vous accédez aux éléments de l'un de ces tableaux de la même manière que vous le feriez pour n'importe quel autre tableau, par exemple $array[0].

$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles

Répétez avec foreach.

foreach ($toppings as $topping) {
    echo $topping, "\n";
}


Chocolat glacé aux pépites d'
érable

Ou jouer avec l'une des fonctions de tableau intégrées bazillion .


Accéder aux éléments imbriqués

Les propriétés des objets et les éléments des tableaux peuvent être plus d'objets et / ou de tableaux - vous pouvez simplement continuer à accéder à leurs propriétés et membres comme d'habitude, par exemple $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

Passer truecomme deuxième argument à json_decode ()

Lorsque vous faites cela, au lieu d'objets, vous obtiendrez des tableaux associatifs - des tableaux avec des chaînes pour les clés. Encore une fois, vous accédez à ses éléments comme d'habitude, par exemple $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

Accès aux éléments de tableau associatif

Lors du décodage d'un objet JSON en un tableau PHP associatif, vous pouvez itérer à la fois les clés et les valeurs en utilisant la foreach (array_expression as $key => $value)syntaxe, par exemple

$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;
}

Tirages

La valeur de la clé «foo» est «foo value»
La valeur de la clé «bar» est «bar value»
La valeur de la clé «baz» est «baz value»


Je ne sais pas comment les données sont structurées

Lisez la documentation pour tout ce dont vous obtenez le JSON.

Regardez le JSON - où vous voyez des accolades {}attendent un objet, où vous voyez des crochets []attendent un tableau.

Frappez les données décodées avec un 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);

et vérifiez la sortie:

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
                )

        )

)

Il vous indiquera où vous avez des objets, où vous avez des tableaux, ainsi que les noms et les valeurs de leurs membres.

Si vous ne pouvez aller aussi loin avant de vous perdre, allez aussi loin et frappez -le avec print_r():

print_r($yummy->toppings[0]);
stdClass Object
(
    [id] => 5002
    [type] => Glazed
)

Jetez-y un coup d'œil dans cet explorateur JSON interactif pratique .

Décomposez le problème en morceaux qui sont plus faciles à comprendre.


json_decode() Retour null

Cela se produit parce que soit:

  1. Le JSON est entièrement constitué de tout cela, null.
  2. Le JSON n'est pas valide - vérifiez le résultat json_last_error_msgou passez-le par quelque chose comme JSONLint .
  3. Il contient des éléments imbriqués sur plus de 512 niveaux de profondeur. Cette profondeur maximale par défaut peut être remplacée en passant un entier comme troisième argument à json_decode().

Si vous devez modifier la profondeur maximale, vous résolvez probablement le mauvais problème. Découvrez pourquoi vous obtenez des données aussi profondément imbriquées (par exemple, le service que vous interrogez et qui génère le JSON a un bogue) et que cela ne se produise pas.


Le nom de la propriété de l'objet contient un caractère spécial

Parfois, vous aurez un nom de propriété d'objet qui contient quelque chose comme un trait d'union -ou un signe arobase @qui ne peut pas être utilisé dans un identificateur littéral. Au lieu de cela, vous pouvez utiliser une chaîne littérale entre accolades pour y remédier.

$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42

Si vous avez un entier comme propriété, voir: Comment accéder aux propriétés d'un objet avec des noms comme des entiers? comme référence.


Quelqu'un a mis JSON dans votre JSON

C'est ridicule mais cela arrive - il y a du JSON encodé sous forme de chaîne dans votre JSON. Décodez, accédez à la chaîne comme d'habitude, décodez -la et obtenez finalement ce dont vous avez besoin.

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';

$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);

echo $toppings[0]->type; //Glazed

Les données ne tiennent pas dans la mémoire

Si votre JSON est trop volumineux pour json_decode()être manipulé immédiatement, les choses commencent à devenir délicates. Voir:


Comment le trier

Voir: Référence: toutes les méthodes de base pour trier les tableaux et les données en PHP .

19 MohdAbdulMujib Oct 26 2016 at 20:24

Vous pouvez utiliser json_decode () pour convertir une chaîne json en objet / tableau PHP.

Par exemple.

Contribution:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

Production:

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)
}

Quelques points à retenir:

  • json_decodeexige que la chaîne soit valide jsonsinon elle retournera NULL.
  • En cas d'échec du décodage, json_last_error()peut être utilisé pour déterminer la nature exacte de l'erreur.
  • Assurez-vous que vous transmettez le utf8contenu ou que json_decodevous risquez une erreur et renvoyez simplement une NULLvaleur.
2 Sayeedamin Nov 06 2019 at 19:31
// 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>";
}
1 KankatalaKrishna Aug 06 2019 at 13:08

Nous pouvons décoder la chaîne json en tableau en utilisant la fonction json_decode en php

1) json_decode ($ json_string) // il retourne un objet

2) json_decode ($ json_string, true) // renvoie un tableau

$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
PaulBurilichev Jan 22 2020 at 21:48

Envisagez d'utiliser JSONPath https://packagist.org/packages/flow/jsonpath

Il y a une explication assez claire sur la façon de l'utiliser et d'analyser un fichier JSON en évitant toutes les boucles proposées. Si vous connaissez XPathpour XMLvous commencerez aimer cette approche.