Comment extraire des données de JSON avec PHP?

214

Ceci est destiné à être une question de référence générale et une réponse couvrant la plupart des interminables "Comment puis-je accéder aux données dans mon JSON?" des questions. Il est ici pour gérer les bases générales du décodage JSON en 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 cela en PHP et accéder aux données résultantes?

user3942918
la source
1
Connexe: Capable de voir une variable dans la sortie de print_r (), mais ne savez pas comment y accéder dans le code , l'exploration JSON interactive dans le contexte de PHP est possible ici: array.include-once.org
hakre
S'il vous plaît, puis-je savoir pourquoi cette question ne considère pas comme une question en double, même 9 utilisateurs ou moins marqués comme doublon pour stackoverflow.com/questions/4343596/parsing-json-file-with-php ? M
Je suis la personne la plus stupide du
@IamtheMostStupidPerson Je vais essayer d'expliquer, même si votre nom d'utilisateur me fait douter que vous l'obtiendrez;). Cette question est posée, et ses réponses sont écrites, de manière "canonique". En tant que tel, c'est un meilleur destinataire pour la cible en double que les autres questions.
Félix Gagnon-Grenier

Réponses:

428

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 textuel - donc une chaîne de fantaisie, 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 des versions PHP des choses qui peuvent être encodées en JSON.

Il n'y a rien de spécial en eux. 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 est juste une chose générique qui n'est pas importante 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 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ès aux éléments du tableau

Vous accédez aux éléments de l'un de ces tableaux de la même manière que 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 dessus avec foreach.

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


Chocolat glacé avec pépites d'
érable

Ou dérangez-vous avec l'une des fonctions de tableau intégrées de bazillion .


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 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 du tableau associatif

Lors du décodage d'un objet JSON en un tableau PHP associatif, vous pouvez itérer les clés et les valeurs à l'aide de 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;
}

Impressions

La valeur de la clé 'foo' est 'valeur foo'
La valeur de la clé 'bar' est 'valeur bar'
La valeur de la clé 'baz' est 'valeur baz'


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

Lisez la documentation pour savoir de quoi vous obtenez le JSON.

Regardez le JSON - où vous voyez des crochets {}attendre un objet, où vous voyez des crochets []attendre 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 œil dans cet explorateur JSON interactif pratique .

Décomposez le problème en morceaux plus faciles à envelopper la tête.


json_decode() Retour null

Cela se produit parce que:

  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 à 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 si profondément imbriquées (par exemple, le service que vous interrogez qui génère le JSON a un bogue) et évitez que cela ne se produise.


Le nom de la propriété d'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 @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 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 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 du JSON encodé comme une chaîne dans votre JSON. Décodez, accédez à la chaîne comme d'habitude, décodez -le et finissez par obtenir 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 en mémoire

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


Comment trier

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

user3942918
la source
vient de trébucher à cette réponse et a constaté que le lien vers array.include-once.org est rompu.
Jeff
@Jeff Merci. Honte à ça. J'ai supprimé le lien.
user3942918
oui, compte tenu du nom du lien et de la façon dont vous l'avez décrit, cela ressemble à une vraie déception.
Jeff
la seule chose qui manque à cette solution était de savoir comment extraire les données d'un autre fichier json. Je recommanderais cette solution: stackoverflow.com/questions/19758954/…
Ishan Srivastava
C'est bien. Je vous remercie.
David Kariuki
17

Vous pouvez utiliser json_decode () pour convertir une chaîne json en un 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_decoderequiert que la chaîne soit valide jsonsinon elle sera renvoyée NULL.
  • En cas de non-décodage, json_last_error()peut être utilisé pour déterminer la nature exacte de l'erreur.
  • Assurez-vous de transmettre du utf8contenu, sinon json_decodevous risquez de vous tromper et de simplement renvoyer une NULLvaleur.
Mohd Abdul Mujib
la source
eh bien, ils n'auraient peut-être pas aimé sa simplicité, néanmoins. Vous pouvez toujours voter;)
Mohd Abdul Mujib
1
La raison la plus probable est probablement qu'il a déjà été répondu et il semble que @MohdAbdulMujib est après une certaine représentation libre
Isaac
3
@Isaac certaines personnes peuvent ne pas être très enthousiastes à l'idée de lire l'intégralité du manuel lorsqu'elles veulent simplement commencer à utiliser la fonction. Sinon, ils feraient mieux de lire le document officiel. Tout l'intérêt de SO est la simplicité dans laquelle les réponses sont fournies. 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
la source
1

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) // il retourne 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
Kankatala Krishna
la source
0

Pensez à 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.

Paul Burilichev
la source
-1

J'ai écrit un package nommé JSON( GitHub , Packagist ). Si vous souhaitez éviter les frais généraux liés à l'utilisation des json_*fonctions, essayez-le.

Exemple

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();

Consultez le wiki ou le didacticiel rapide pour vous familiariser avec celui-ci.

De plus, si vous voulez lire des fichiers JSON et extraire ses données (car il semble que vous essayez de le faire), voir le package JSONFile , que je l'ai également écrit.

MAChitgarha
la source
-2

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

Vérifiez ci-dessous le code pour convertir json en tableau PHP, si JSON est correct, alors json_decode()fonctionne bien et retournera un tableau, mais s'il est mal formé JSON, alors il retournera 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) );

Si JSON est mal formé et que vous attendez uniquement un tableau, vous pouvez utiliser cette fonction,

<?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) );

Si JSON est mal formé et que vous souhaitez arrêter l'exécution de code, vous pouvez utiliser cette fonction,

<?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) );

Vous pouvez utiliser n'importe quelle fonction dépend de vos besoins,

harish sharma
la source