91 votes

Comment convertir une chaîne de caractères en objet JSON en PHP

J'ai le résultat suivant d'une requête SQL :

{"Coords":[
    {"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},
    {"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},
    {"Accuracy":"65","Latitude":"53.27770755361785","Longitude":"-9.011979642121824","Timestamp":"Fri Jul 05 2013 12:02:09 GMT+0100 (IST)"},
    {"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"},
    {"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"} 
    ]
}

Il s'agit actuellement d'une chaîne de caractères en PHP. Je sais qu'il est déjà sous forme JSON, existe-t-il un moyen simple de le convertir en objet JSON ?

J'ai besoin que ce soit un objet pour pouvoir ajouter un élément/élément/objet supplémentaire comme ce qu'est déjà "Coords".

151voto

Guilherme Nascimento Points 5037

Ce que @deceze a dit est correct, il semble que votre JSON soit malformé, essayez ceci :

{
    "Coords": [{
        "Accuracy": "30",
        "Latitude": "53.2778273",
        "Longitude": "-9.0121648",
        "Timestamp": "Fri Jun 28 2013 11:43:57 GMT+0100 (IST)"
    }, {
        "Accuracy": "30",
        "Latitude": "53.2778273",
        "Longitude": "-9.0121648",
        "Timestamp": "Fri Jun 28 2013 11:43:57 GMT+0100 (IST)"
    }, {
        "Accuracy": "30",
        "Latitude": "53.2778273",
        "Longitude": "-9.0121648",
        "Timestamp": "Fri Jun 28 2013 11:43:57 GMT+0100 (IST)"
    }, {
        "Accuracy": "30",
        "Latitude": "53.2778339",
        "Longitude": "-9.0121466",
        "Timestamp": "Fri Jun 28 2013 11:45:54 GMT+0100 (IST)"
    }, {
        "Accuracy": "30",
        "Latitude": "53.2778159",
        "Longitude": "-9.0121201",
        "Timestamp": "Fri Jun 28 2013 11:45:58 GMT+0100 (IST)"
    }]
}

Utilisez json_decode pour convertir une chaîne en objet ( stdClass ) ou tableau : http://php.net/manual/en/function.json-decode.php

[édité]

Je n'ai pas compris ce que vous voulez dire par "un objet JSON officiel" Mais supposons que vous souhaitiez ajouter du contenu à Json via PHP et le reconvertir directement en JSON ?

en supposant que vous avez la variable suivante :

$data = '{"Coords":[{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27770755361785","Longitude":"-9.011979642121824","Timestamp":"Fri Jul 05 2013 12:02:09 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"}]}';

Vous devez le convertir en Objet (stdClass) :

$manage = json_decode($data);

Mais travailler avec stdClass est plus compliqué que PHP-Array, alors essayez ceci (utilisez le second paramètre avec true ) :

$manage = json_decode($data, true);

De cette façon, vous pouvez utiliser les fonctions de tableau : http://php.net/manual/en/function.array.php

ajouter un élément :

$manage = json_decode($data, true);

echo 'Before: <br>';
print_r($manage);

$manage['Coords'][] = Array(
    'Accuracy' => '90'
    'Latitude' => '53.277720488429026'
    'Longitude' => '-9.012038778269686'
    'Timestamp' => 'Fri Jul 05 2013 11:59:34 GMT+0100 (IST)'
);

echo '<br>After: <br>';
print_r($manage);

supprimer le premier élément :

$manage = json_decode($data, true);
echo 'Before: <br>';
print_r($manage);
array_shift($manage['Coords']);
echo '<br>After: <br>';
print_r($manage);

si vous voulez sauvegarder en json dans un fichier base de données ou un fichier :

$data = '{"Coords":[{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27770755361785","Longitude":"-9.011979642121824","Timestamp":"Fri Jul 05 2013 12:02:09 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"}]}';

$manage = json_decode($data, true);

$manage['Coords'][] = Array(
    'Accuracy' => '90'
    'Latitude' => '53.277720488429026'
    'Longitude' => '-9.012038778269686'
    'Timestamp' => 'Fri Jul 05 2013 11:59:34 GMT+0100 (IST)'
);

if (($id = fopen('datafile.txt', 'wb'))) {
    fwrite($id, json_encode($manage));
    fclose($id);
}

J'espère avoir compris votre question.

Bonne chance.

23voto

Miro Markaravanes Points 3167

Pour reconvertir une chaîne JSON valide, vous pouvez utiliser la fonction json_decode() método.

Pour le reconvertir en objet, utilisez cette méthode :

$jObj = json_decode($jsonString);

Et pour le convertir en un tableau associatif, définissez le deuxième paramètre comme suit true :

$jArr = json_decode($jsonString, true);

En convertissant la chaîne de caractères mentionnée en l'une ou l'autre, vous devriez obtenir une chaîne JSON valide. Pour y parvenir, vous devez faire ce qui suit :

  1. Dans le Coords supprimez les deux " (guillemets doubles) du début et de la fin de l'objet.
  2. Les objets d'un tableau sont séparés par des virgules ( , ), il faut donc ajouter des virgules entre les objets dans le fichier Coords le tableau

Et vous aurez une chaîne JSON valide

Voici votre chaîne JSON que j'ai convertie en une chaîne valide : http://pastebin.com/R16NVerw

10voto

Nabeel Arshad Points 397

Vous pouvez utiliser ceci par exemple

$array = json_decode($string,true)

mais validez le Json avant. Vous pouvez valider à partir de http://jsonviewer.stack.hu/

-1voto

drag.spas Points 59

Essayez avec json_encode() .

Et regardez encore JSON valide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X