161 votes

PHP json_decode() retourne NULL avec un JSON apparemment valide ?

Cet objet JSON est stocké dans un fichier texte :

{
    "MySQL": {
        "Server": "(server)",
        "Username": "(user)",
        "Password": "(pwd)",
        "DatabaseName": "(dbname)"
    },
    "Ftp": {
        "Server": "(server)",
        "Username": "(user)",
        "Password": "(pwd)",
        "RootFolder": "(rf)"
    },
    "BasePath": "../../bin/",
    "NotesAppPath": "notas",
    "SearchAppPath": "buscar",
    "BaseUrl": "http:\/\/montemaiztusitio.com.ar",
    "InitialExtensions": [
        "nem.mysqlhandler",
        "nem.string",
        "nem.colour",
        "nem.filesystem",
        "nem.rss",
        "nem.date",
        "nem.template",
        "nem.media",
        "nem.measuring",
        "nem.weather",
        "nem.currency"
    ],
    "MediaPath": "media",
    "MediaGalleriesTable": "journal_media_galleries",
    "MediaTable": "journal_media",
    "Journal": {
        "AllowedAdFileFormats": [
            "flv:1",
            "jpg:2",
            "gif:3",
            "png:4",
            "swf:5"
        ],
        "AdColumnId": "3",
        "RSSLinkFormat": "%DOMAIN%\/notas\/%YEAR%-%MONTH%-%DAY%\/%TITLE%/",
        "FrontendLayout": "Flat",
        "AdPath": "ad",
        "SiteTitle": "Monte Maíz: Tu Sitio",
        "GlobalSiteDescription": "Periódico local de Monte Maíz.",
        "MoreInfoAt": "Más información aquí, en el Periódico local de Monte Maíz.",
        "TemplatePath": "templates",
        "WeatherSource": "accuweather:SAM|AR|AR005|MONTE MAIZ",
        "WeatherMeasureType": "1",
        "CurrencySource": "cotizacion-monedas:Dolar|Euro|Real",
        "TimesSingular": "vez",
        "TimesPlural": "veces"
    }
}

Lorsque j'essaie de le décoder avec json_decode() il renvoie NULL. Pourquoi ? Le fichier est lisible (j'ai essayé de faire un écho à file_get_contents() et cela a fonctionné correctement).

J'ai testé JSON contre http://jsonlint.com/ et c'est tout à fait valable.

Qu'est-ce qui ne va pas ?

0voto

ThoQ Luong Points 416

Dans mon cas, c'est à cause du guillemet simple dans la chaîne JSON.

Le format JSON n'accepte que les doubles guillemets pour les clés et les valeurs des chaînes.

Ejemplo:

$jsonString = '{\'hello\': \'PHP\'}'; // valid value should be '{"hello": "PHP"}'
$json = json_decode($jsonString);
print $json; // null

Je me suis trompé à cause de la syntaxe du Javascript. En Javascript, bien sûr, nous pouvons faire comme ceci :

let json = {
    hello: 'PHP' // no quote for key, single quote for string value
}

// OR:
json = {
    'hello': 'PHP' // single quote for key and value
}

mais plus tard lors de la conversion de ces objets en chaîne JSON :

JSON.stringify(json); // "{"hello":"PHP"}"

0voto

namal Points 412

Avant d'appliquer les solutions liées à PHP, validez votre format JSON. C'est peut-être là le problème. Essayez ceci validateur de format JSON en ligne .

-1voto

shasi Points 1862

Pour ma part, j'ai dû désactiver le rapport_d'erreur Le système de gestion de l'information a été mis en place pour que la fonction json_decode() fonctionne correctement. Cela semble bizarre, mais c'est vrai dans mon cas. Parce qu'il y a une notice imprimée entre la chaîne JSON que j'essaie de décoder.

-1voto

hasan akbari Points 11

J'ai eu exactement le même problème Mais il a été résolu avec ce code

$zip = file_get_contents($file);
$zip = json_decode(stripslashes($zip), true);

-1voto

devanshi singh Points 1

J'ai eu le même problème et aucune des réponses ne m'a aidé. L'une des variables de mon objet JSON avait la valeur Andaman & Nicobar . J'ai supprimé cette & et mon code a fonctionné parfaitement.

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