PHP JSON decode () renvoie NULL avec JSON valide?

j'ai cet objet JSON 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"
    }
}

quand j'essaie de le décoder avec json_decode() , il renvoie NULL. Pourquoi? Le fichier est lisible (j'ai essayé de faire écho à file_get_contents() et ça a marché).

j'ai testé JSON contre http://jsonlint.com / et c'est parfaitement valable.

Qu'est-ce qui ne va pas ici?

Solution

a la recherche de réponses sur Google, je suis revenu à SO: json_decode renvoie NULL après l'appel de webservice . Mon fichier JSON avait la séquence UTF BOM (quelques caractères binaires qui ne devraient pas y être), donc, cassant la structure JSON. Suis allé à l'Éditeur Hexadécimal, effacé les octets. Tout est revenu à la normale. Pourquoi est-ce arrivé? parce que j'ai édité le fichier en utilisant le bloc-notes de Microsoft Windows. Terrible idée!

69
demandé sur Community 2010-03-09 18:51:13

16 réponses

Il pourrait être l'encodage des caractères spéciaux. Vous pouvez demander json_last_error () pour obtenir des informations précises.

mise à jour: le problème est résolu, regardez le paragraphe" Solution " dans la question.

51
répondu Pekka 웃 2010-03-09 18:26:59

cela a fonctionné pour moi

json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string), true );
48
répondu Dunith Dhanushka 2014-08-18 15:55:34

si vous cochez la requête dans chrome, vous verrez que le JSON est du texte, donc il y a eu du code vide ajouté au JSON.

vous pouvez l'effacer en utilisant

$k=preg_replace('/\s+/', '',$k);

ensuite vous pouvez utiliser:

json_decode($k)

print_r affichera alors le tableau.

20
répondu user2254008 2016-02-02 22:51:31

j'ai eu le même problème et je l'ai résolu simplement en remplaçant le caractère de citation avant le décodage.

$json = str_replace('"', '"', $json);
$object = json_decode($json);

ma valeur JSON a été générée par JSON.fonction stringify.

12
répondu Yapp Ka Howe 2014-01-02 02:50:50

vous pouvez essayer avec.

json_decode(stripslashes($_POST['data']))
11
répondu Gabriel Castillo Prada 2015-11-13 04:20:33

peut-être que certains personnages cachés jouent avec votre json, essayez ceci:

$json = utf8_encode($yourString);
$data = json_decode($json);
9
répondu Albert Abdonor 2016-03-08 17:56:07
$k=preg_replace('/\s+/', '',$k); 

l'a fait pour moi. Et oui, des tests sur Chrome. Thx to user2254008

6
répondu Jürgen Math 2014-12-17 10:54:45

j'ai juste pensé ajouter ceci, alors que je suis entré dans ce numéro aujourd'hui. S'il y a du remplissage de chaîne autour de votre chaîne JSON, json_decode retournera NULL.

si vous tirez le JSON d'une source autre qu'une variable PHP, il serait sage de le "couper" en premier:

$jsonData = trim($jsonData);
4
répondu Phil LaNasa 2013-10-10 20:42:47

comme indiqué par Jürgen Math en utilisant la méthode preg_replace listée par user2254008 l'a fixé pour moi aussi.

ce N'est pas limité à Chrome, il semble être un problème de conversion de jeu de caractères (au moins dans mon cas, Unicode -> UTF8) cela a corrigé tous les problèmes que j'avais.

en tant que futur noeud, L'objet JSON que je décodais venait du JSON de Python.fonction dump. Cela à son tour causé d'autres données insalubres à faire passer bien qu'il ait été être traitée facilement.

1
répondu Destreyf 2013-06-19 23:17:39

si vous obtenez json de la base de données, mettez

mysqli_set_charset($con, "utf8");

après avoir défini le lien de connexion $ con

1
répondu TomoMiha 2014-11-18 09:33:10

économise juste une fois. J'ai passé 3 heures à découvrir que c'était juste un problème d'encodage html. Essayez

if(get_magic_quotes_gpc()){
   $param = stripslashes($row['your column name']);
}else{
  $param = $row['your column name'];
}

$param = json_decode(html_entity_decode($param),true);
$json_errors = array(
JSON_ERROR_NONE => 'No error has occurred',
JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
);
echo 'Last error : ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;
print_r($param);
1
répondu Samuel Kwame Antwi 2015-10-31 23:12:51

cela vous aide à comprendre quel est le type d'erreur

<?php
// A valid json string
$json[] = '{"Organization": "PHP Documentation Team"}';

// An invalid json string which will cause an syntax 
// error, in this case we used ' instead of " for quotation
$json[] = "{'Organization': 'PHP Documentation Team'}";


foreach ($json as $string) {
    echo 'Decoding: ' . $string;
    json_decode($string);

    switch (json_last_error()) {
        case JSON_ERROR_NONE:
            echo ' - No errors';
        break;
        case JSON_ERROR_DEPTH:
            echo ' - Maximum stack depth exceeded';
        break;
        case JSON_ERROR_STATE_MISMATCH:
            echo ' - Underflow or the modes mismatch';
        break;
        case JSON_ERROR_CTRL_CHAR:
            echo ' - Unexpected control character found';
        break;
        case JSON_ERROR_SYNTAX:
            echo ' - Syntax error, malformed JSON';
        break;
        case JSON_ERROR_UTF8:
            echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
        break;
        default:
            echo ' - Unknown error';
        break;
    }

    echo PHP_EOL;
}
?>
1
répondu Enrico Tempesti 2017-01-27 18:43:13

ici, vous pouvez trouver Petit JSON wrapper avec des mesures correctives qui traite BOM et non-ASCI question: https://stackoverflow.com/a/43694325/2254935

1
répondu Krzysztof Przygoda 2017-05-23 12:02:43

j'ai résolu ce problème en imprimant le JSON, puis en vérifiant la page source (Ctrl/CMD + U):

print_r(file_get_contents($url));

il S'est avéré qu'il y avait une étiquette <pre> .

0
répondu Jeffrey Roosendaal 2016-10-31 10:13:13

vous devez vous assurer que ces points

1. votre chaîne JSON n'a pas de caractères inconnus

2. JSON string peut afficher à partir de visualiseur JSON en ligne (vous pouvez rechercher sur google comme visualiseur en ligne ou parser pour json) il doit afficher sans aucune erreur

3. votre chaîne de caractères n'a pas d'entités html il devrait être simple texte / chaîne de caractères

pour l'explication du point 3

$html_product_sizes_json=htmlentities($html);
    $ProductSizesArr = json_decode($html_product_sizes_json,true);

à (supprimer la fonction htmlentities ())

$html_product_sizes_json=$html;
    $ProductSizesArr = json_decode($html_product_sizes_json,true);
0
répondu Hassan Saeed 2017-03-12 12:11:20
<?php 
$json_url = "http://api.testmagazine.com/test.php?type=menu";
$json = file_get_contents($json_url);
$json=str_replace('},

]',"}

]",$json);
$data = json_decode($json);

echo "<pre>";
print_r($data);
echo "</pre>";
?>
-5
répondu user2648057 2013-08-03 07:15:53