web-dev-qa-db-fra.com

Comment extraire des données de JSON avec PHP?

Il s’agit d’une question de référence générale et d’une réponse couvrant un grand nombre de questions sans fin "Comment accéder aux données de mon JSON?". Il est là pour gérer les bases générales du décodage JSON dans PHP et de l’accès 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 ceci dans PHP et accéder aux données résultantes?

188
user3942918

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 élégante, mais toujours juste une chaîne. Décodez-le dans PHP en utilisant json_decode() .

_ $data = json_decode($json);
_

Vous pourriez y trouver:

Ce sont les choses qui peuvent être encodées en JSON. Ou plus précisément, ce sont les versions de PHP des choses qui peuvent être encodées 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 types de base quotidiens PHP .

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


Accès aux propriétés de l'objet

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 non statiques publiques 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 tout autre tableau, par exemple. $array[0] .

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

$toppings = json_decode($json);

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

Itérez dessus avec foreach .

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

Vitré
Chocolat avec pépites
Érable

Ou déconner avec l'un des fonctions de tableau bazillion intégrées .


Accès 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 à leurs 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
_

en passant true comme deuxième argument de json_decode ()

Lorsque vous faites cela, à la place des objets, vous obtenez des tableaux associatifs - des tableaux avec des chaînes pour les clés. De nouveau, vous accédez aux éléments de celle-ci comme d'habitude, par ex. _$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
_

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 _{}_ attend un objet, où vous voyez des crochets _[]_ attend un tableau.

Frapper 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 dira où vous avez des objets, où vous avez des tableaux, ainsi que les noms et les valeurs de leurs membres.

Si vous ne pouvez vous rendre aussi loin avant de vous perdre, allez aussi loin et frappez ce avec print_r():

_print_r($yummy->toppings[0]);
_
_stdClass Object
(
    [id] => 5002
    [type] => Glazed
)
_

Regardez-le dans cet explorateur JSON interactif très pratique .

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


json_decode() RENVOIE null

Cela se produit parce que:

  1. Le JSON est entièrement constitué de cela, null.
  2. Le JSON n'est pas valide. Vérifiez le résultat de json_last_error_msg ou transmettez-le de la même manière que JSONLint .
  3. Il contient des éléments imbriqués plus de 512 niveaux. Cette profondeur maximale par défaut peut être remplacée en passant un entier en tant que troisième argument à json_decode() .

Si vous devez modifier la profondeur maximale, vous résolvez probablement le problème. Découvrez pourquoi vous obtenez des données si profondément imbriquées (par exemple, le service que vous interrogez qui génère le JSON a un bogue) et faites en sorte 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 contenant quelque chose comme un trait d'union _-_ ou un signe _@_ qui ne peut pas être utilisé dans un identificateur littéral. Au lieu de cela, vous pouvez utiliser un littéral de chaîne entre accolades pour le résoudre.

_$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'objet avec des noms comme des entiers? comme référence.


Quelqu'un a mis JSON dans votre JSON

C'est ridicule, mais ça arrive - il y a JSON encodé comme une chaîne dans votre JSON. Décodez, accédez à la chaîne comme d'habitude, décodez cela , 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 que json_decode() puisse le gérer immédiatement, les choses commencent à devenir difficiles. Voir:


Comment trier

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

373
user3942918

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

Par exemple.

Entrée:

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

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

Sortie:

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_decode requiert que la chaîne soit valide json sinon 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 contenu utf8 ou json_decode peut provoquer une erreur et ne renvoyer qu'une valeur NULL.
13
Mohd Abdul Mujib