2 votes

Comment convertir un JSON partiellement invalide en un JSON valide ?

J'utilise php pour récupérer une page web et obtenir cette chaîne :

'[{endTime:"2019-06-05T17:15:00.000+10:00",startTime:"2019-06-05T17:00:00.000+10:00"}]'

qui n'est pas un json valide, les noms des clés sont encapsulés ...

J'utilise preg_replace pour créer un json valide :

$x = '[{endTime:"2019-06-05T17:15:00.000+10:00",startTime:"2019-06-05T17:00:00.000+10:00"}]'
$j = preg_replace('/(\w+)\s{0,1}:/', '"\1":', $x);

et obtenir cette valeur :

'[{"endTime":"2019-06-"05T17":"15":00.000+"10":00","startTime":"2019-06-"05T17":"00":00.000+"10":00"}]'

mais je veux cette valeur :

'[{"endTime":"2019-06-05T17:15:00.000+10:00","startTime":"2019-06-05T17:00:00.000+10:00"}]'

Comment puis-je résoudre ce problème ?

2voto

Emma Points 1

RegEx 1

Votre expression originale semble être trouvée, nous la modifierions juste légèrement pour :

([{,])(\w+)(\s+)?:

et ça pourrait marcher, nous ajoutons une limite à gauche :

([{,])

et une frontière droite :

:

et notre attribut clé est dans ce groupe de capture :

(\w+)

RegEx 2

Nous pouvons étendre notre première expression à :

([{,])(\s+)?(\w+)(\s+)?:

dans ce cas, nous pourrions avoir des espaces avant l'attribut clé :

Démo

Test 1

$re = '/([{,])(\w+)(\s+)?:/m';
$x = '[{endTime:"2019-06-05T17:15:00.000+10:00",startTime:"2019-06-05T17:00:00.000+10:00"}]';
$subst = '$1"$2":';

$result = preg_replace($re, $subst, $x);

echo $result;

Test 2

$re = '/([{,])(\s+)?(\w+)(\s+)?:/m';
$x = '[{endTime:"2019-06-05T17:15:00.000+10:00",startTime:"2019-06-05T17:00:00.000+10:00"}]';
$subst = '$1"$3":';

$result = preg_replace($re, $subst, $x);

echo $result;

Sortie

[{"endTime":"2019-06-05T17:15:00.000+10:00","startTime":"2019-06-05T17:00:00.000+10:00"}]

Démo

Circuit RegEx

jex.im visualise les expressions régulières :

enter image description here

0voto

Hamed Ghasempour Points 455

utiliser ce modèle :

([{,])([^:]+):

il trouvera tous les textes qui sont suivis par { o ,

et utiliser ceci pour le remplacement :

$1"$2":

Il ajoutera une double citation des deux côtés de votre mot.

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