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 ?

5voto

Dharman Points 1540

Cette erreur signifie que votre chaîne JSON n'est pas valide !

Activez le lancement d'exceptions lorsqu'une erreur se produit et PHP lancera une exception avec la raison de l'échec.

Utilisez ceci :

$json = json_decode($string, null, 512, JSON_THROW_ON_ERROR);

3voto

Grant Points 864

La chose la plus importante à retenir, lorsque vous obtenez un résultat NULL à partir de données JSON valides, est d'utiliser la commande suivante :

json_last_error_msg();

Ie.

var_dump(json_last_error_msg());
string(53) "Control character error, possibly incorrectly encoded"

Vous corrigez ensuite ce problème avec :

$new_json = preg_replace('/[[:cntrl:]]/', '', $json);

3voto

Voici comment j'ai résolu le mien https://stackoverflow.com/questions/17219916/64923728 .. Le fichier JSON doit être encodé en UTF-8, le mien était en UTF-8 avec BOM ce qui ajoutait une bizarrerie. &65279 ; à la sortie de la chaîne json, ce qui provoque json_decode() pour renvoyer null

2voto

user2882971 Points 11

Dans mon cas, je rencontrais le même problème, mais il était dû à des slashs dans la chaîne json.

json_decode(stripslashes($YourJsonString))

O

json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $YourJsonString), true );

Si cela ne fonctionne pas, remplacez d'abord les guillemets de html quote, cela peut se produire si vous envoyez des données de javascript à php.

    $YourJsonString = stripslashes($YourJsonString);
    $YourJsonString = str_replace('"', '"', $YourJsonString);
    $YourJsonString = str_replace('["', '[', $YourJsonString);
    $YourJsonString = str_replace('"]', ']', $YourJsonString);
    $YourJsonString = str_replace('"{', '{', $YourJsonString);
    $YourJsonString = str_replace('}"', '}', $YourJsonString);
    $YourJsonObject = json_decode($YourJsonString);

Le problème sera résolu,

2voto

Dario Zadro Points 387

Il s'agit probablement d'une nomenclature, comme d'autres l'ont mentionné. Vous pouvez essayer ceci :

    // BOM (Byte Order Mark) issue, needs removing to decode
    $bom = pack('H*','EFBBBF');
    $response = preg_replace("/^$bom/", '', $response);
    unset($tmp_bom);
    $response = json_decode($response);

Il s'agit d'un bogue connu avec certains SDK, tels que Authorize.NET

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