2
votes

Comment puis-je décoder en PHP une chaîne json qui contient une chaîne json comme valeur?

J'ai besoin de décoder une chaîne JSON en PHP mais le fait est que la chaîne a une chaîne codée JSON comme l'une des valeurs. Quelque chose comme ça:

{
    "key1": "value1",
    "key2": "{\"key3\":\"{\\\"key4\\\":\\\"value4\\\"}\"}"
}

J'essaye d'utiliser json_decode pour l'analyser dans un tableau mais il échoue toujours avec l'erreur que la syntaxe est incorrecte. Si je le mets dans n'importe quel validateur que vous pouvez trouver en ligne, cela indique que la chaîne est valide. Dois-je utiliser une autre méthode pour analyser la chaîne?

PS: Je suis d'accord avec le fait qu'une fois décodée, la valeur de key2 ne sera pas un tableau mais plutôt une chaîne que je devrais décoder à nouveau .

Merci!


6 commentaires

avez-vous essayé ceci: $ decoded = json_decode ('votre chaîne');


Comment avez-vous intégré cette valeur JSON dans votre script? Si vous avez écrit ceci sous forme de chaîne dans code , alors vous devez faire attention aux contre-obliques… Commencez par créer une sortie de débogage de la variable que vous passez à json_encode, et voyez si vous avez toujours autant de contre-obliques comme vous le pensiez…


c'est un nid de frelons. Postez le code où ce json (valide mais peu maniable) est produit, vous pourriez avoir plus d'aide disponible ici.


Je l'ai reçu d'un appel de serveur à serveur à partir d'un point de terminaison externe que je ne contrôle malheureusement pas. L'autre extrémité me donne un gros json qui à un moment donné contient une sorte de reçu qu'il est encodé en json et mis dans une chaîne. Le reste du JSON est une structure JSON habituelle, mais l'une des valeurs est le reçu codé json mis en tant que valeur de chaîne. Je dois tout décoder avant de le traiter correctement.


Ce que vous avez publié n'est pas JSON valide. Ce serait JSON valide si tout le PHP était supprimé et que le contenu entre ' et ' était laissé tel quel. De cette façon, les caractères \ seraient traités comme des caractères d'échappement JSON et non comme des caractères d'échappement PHP. Vous avez probablement introduit un nouveau problème lors de la construction de votre scénario de test réduit.


@Quentin J'étais trop zélé dans mon montage. Annulé maintenant ...


4 Réponses :


-1
votes

vous pouvez utiliser json_decode () deux fois ou plus

{"key1":"value1","key2":"{\"key3\":\"{\\\"key4\\\":\\\"value4\\\"}\"}"}

Cela vous donne un objet avec key3. et encore une fois, vous pouvez utiliser json_decode ().

C'est la chaîne correcte pour votre structure si elle diffère d'elle, cela peut être faux.

$a = {
   "key1": "value1",
   "key2": "{\"key3\":\"{\\\"key4\\\":\\\"value4\\\"}\"}"
 }
 $b = json_decode($a);
 $c = json_decode($b->key2);

NOTE : Je pense que je devrais écrire une modification à ce sujet. lorsque vous utilisez \ in string, il met \ dans votre chaîne si vous voulez copier exactement cela, vous devez les remplacer. si vous utilisez json_last_error (), vous donnez une erreur de syntaxe dans cette chaîne.

REMARQUE: Si vous aimez la réponse ci-dessus de @mitkosoft, vous modifiez votre structure à cause de deux problèmes. Tout d'abord, vous changez votre objet en tableau. Deuxièmement, si vous décodez au premier niveau, vous devriez obtenir votre valeur "key2" une chaîne et non un tableau. C'est une chaîne json que vous pouvez refaire décoder.


5 commentaires

$ a = {...} n'est même pas JSON pour commencer.


C'est là que réside mon problème. J'ai essayé json_decode mais cela renvoie une erreur json indiquant que la synthax est invalide. Je ne peux pas faire json_decode ($ a) dans votre exemple


{"clé1": "valeur1", "clé2": "{\" clé3 \ ": \" {\\\ "clé4 \\\": \\\ "valeur‌ 4 \\\"} \ "}" } c'est juste json qui a été créé par json_encode en php.


cela ne mène nulle part: $ b vaut null et la ligne suivante échouera.


Oui, vous ne copiez pas cela exactement car en php, lorsque vous utilisez \\, il met \ dans une chaîne et si vous utilisez json_last_eroor (), vous obtenez une syntaxe erronée. vous devez donc les remplacer si vous voulez copier ceci



0
votes

Votre json est mauvais, vous avez des "alentours inutiles {}

http://prntscr.com/mjkrcb

$a = '{
    "key1": "value1",
    "key2": {"key3":{"key4":"value4"}}
}';

var_dump(json_decode($a));


0 commentaires

1
votes

Sur la base de l'entrée fournie - vous devez remplacer tous ces méchants contre-obliques et doubles guillemets afin d'obtenir le JSON correct:

Array
(
[key1] => value1
[key2] => Array
    (
        [key3] => Array
            (
                [key4] => value4
            )
    )
)

Sortie:

<?php
$s = '{
    "key1": "value1",
    "key2": "{\"key3\":\"{\\\"key4\\\":\\\"value4\\\"}\"}"
}';

$s = str_replace('\\', '', $s);
$s = str_replace('"{', '{', $s);
$s = str_replace('}"', '}', $s);

print_r(json_decode($s, true));
?>


0 commentaires

0
votes

Vous pouvez préparer votre chaîne avec cette ligne de code:

    $json_string.= '{"id":"'.$variable.'","name":"'.preg_replace("~[\"]~","\\\\\"",$variable_name).'","other_name":"'.preg_replace("~[\"]~","",$other_name_variable).'"},';

Vous devez alors convertir la chaîne en tableau JSON. N'oubliez pas les guillemets droits et le format de chaîne. En savoir plus sur JSON: https://www.json.org/ - ici vous pouvez trouver des explications et des exemples En savoir plus sur la fonction preg_replace: http://php.net/manual/en/function .preg-replace.php


0 commentaires