Comment puis-je extraire des données de JSON avec PHP?

il s'agit d'une question et d'une réponse de référence générale portant sur plusieurs des interminables "Comment puis-je accéder aux données de mon JSON?" des questions. Il est ici pour gérer les grandes bases de décodage JSON en PHP et 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 en PHP et accéder aux données résultantes?

153
demandé sur Paul Crovella 2015-03-27 22:38:46

2 réponses

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 de caractères fantaisiste, mais encore juste une chaîne de caractères. Décoder en PHP en utilisant json_decode() .

 $data = json_decode($json);

vous y trouverez peut-être:

ce sont les choses qui peuvent être encodées dans JSON. Ou plus précisément, ce sont les versions de PHP des choses qui peuvent être codé dans JSON.

ils n'ont rien de spécial. Ce ne sont pas des objets JSON ou des tableaux JSON."Vous avez décodé le JSON - vous avez maintenant basic everyday PHP types .

les Objets sont des instances de stdClass , une classe intégrée qui est juste un "1519740920 génériques" chose ce n'est pas important ici.


Accès 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 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ès aux éléments du tableau

Vous accéder aux éléments d'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érer sur elle avec foreach .

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

Vitré

Chocolat avec pépites

Maple

ou de désordre avec l'un des bazillion intégré Fonctions réseau .


accès aux articles imbriqués

les propriétés des objets et des éléments de 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

passant true comme second argument à json_decode()

quand vous faites ceci, au lieu des objets vous obtiendrez des tableaux associatifs - tableaux avec des chaînes pour les clés. Encore une fois, vous accédez aux éléments de celui-ci 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

ne sait pas comment les données sont structurées

lisez la documentation pour ce que vous recevez du JSON.

regardez le JSON - où vous voyez des crochets bouclés {} s'attendre à un objet, où vous voyez des crochets 1519200920" s'attendre à un tableau.

Hit 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érifier 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, avec les noms et les valeurs de leurs membres.

si vous ne pouvez aller aussi loin avant d'obtenir perdu - ne pas aller aussi loin et de cliquer sur que avec print_r() :

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

décomposez le problème en morceaux qui sont plus faciles à enrouler votre tête autour.


json_decode() retourne null

cela se produit parce que soit:

  1. Le JSON est entièrement constitué de juste que, null .
  2. le JSON est invalide-vérifiez le résultat de json_last_error_msg ou mettez-le à travers quelque chose comme JSONLint .
  3. il contient des éléments imbriqués à plus de 512 niveaux de profondeur. Cette profondeur max par défaut peut être dépassée en passant un entier comme troisième argument à json_decode() .

si vous avez besoin de changer la profondeur maximale, vous êtes probablement résoudre le mauvais problème. Découvrez pourquoi vous obtenez des données si profondément imbriquées (par exemple, le service que vous demandez qui génère le JSON a un bug) et obtenez 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 au signe @ qui ne peut pas être utilisé dans un identificateur littéral. Au lieu de cela, vous pouvez utiliser une chaîne littérale à l'intérieur des accolades curly pour l'adresser.

$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 des objets 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 à l'intérieur votre JSON. Décodez, accédez à la chaîne comme d'habitude, décodez que , et finalement obtenir ce que 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 rentre pas dans la mémoire

si votre JSON est trop grand pour json_decode() à gérer à la fois les choses commencent à être délicates. Voir:


comment le trier

voir: référence: tous les moyens de base pour trier les tableaux et les données en PHP .

306
répondu Paul Crovella 2017-09-22 23:00:09

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 exige que la chaîne soit valide json sinon elle retournera NULL .
  • en cas de défaut de décodage, json_last_error() peut être utilisé pour déterminer la nature exacte de l'erreur.
  • assurez-vous de passer dans utf8 contenu, ou json_decode peut erreur et juste retourner une valeur NULL .
8
répondu Mohd Abdul Mujib 2016-10-26 13:24:54