PHP json_decode () возвращает NULL с допустимым JSON? - PullRequest
86 голосов
/ 09 марта 2010

Этот объект JSON хранится в текстовом файле:

{
    "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"
    }
}

Когда я пытаюсь декодировать его с помощью json_decode(), возвращается NULL. Зачем? Файл доступен для чтения (я попытался повторить file_get_contents(), и он работал нормально).

Я протестировал JSON против http://jsonlint.com/, и это совершенно верно.

Что здесь не так?

Решение

Ища ответы в Google, я вернулся к SO: json_decode возвращает NULL после вызова веб-службы . Мой JSON-файл имел последовательность UTF BOM (некоторые двоичные символы, которых там быть не должно), таким образом, нарушая структуру JSON. Зашел в Hex Editor, стер байты. Все вернулось на круги своя. Почему это случилось? Потому что я редактировал файл с помощью блокнота Microsoft Windows. Ужасная идея!

Ответы [ 16 ]

61 голосов
/ 18 августа 2014

Это сработало для меня

json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string), true );
59 голосов
/ 09 марта 2010

Это может быть кодировка специальных символов. Вы можете попросить json_last_error () получить определенную информацию.

Обновление: проблема решена, посмотрите на пункт «Решение» в вопросе.

23 голосов
/ 07 апреля 2013

Если вы проверите запрос в chrome, вы увидите, что JSON - это текст, поэтому в JSON добавлен пустой код.

Вы можете очистить его с помощью

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

Тогда вы можете использовать:

json_decode($k)

print_r отобразит массив.

21 голосов
/ 13 ноября 2015

Вы можете попробовать с этим.

json_decode(stripslashes($_POST['data']))
12 голосов
/ 02 января 2014

У меня была та же проблема, и я решил ее, просто заменив символ кавычки перед декодированием.

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

Мое значение JSON было сгенерировано функцией JSON.stringify.

9 голосов
/ 08 марта 2016

Возможно, некоторые скрытые персонажи связываются с вашим json, попробуйте это:

$json = utf8_encode($yourString);
$data = json_decode($json);
6 голосов
/ 28 апреля 2013
$k=preg_replace('/\s+/', '',$k); 

сделал это для меня. И да, тестирование на Chrome. Спасибо пользователю2254008

4 голосов
/ 11 октября 2013

Просто подумал, что добавлю это, когда столкнулся с этим вопросом сегодня. Если вокруг JSON-строки есть отступы, json_decode вернет NULL.

Если вы извлекаете JSON из источника, отличного от переменной PHP, было бы разумно сначала его "обрезать":

$jsonData = trim($jsonData);
2 голосов
/ 27 января 2017

это поможет вам понять, какой тип ошибки

<?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 голос
/ 29 апреля 2017

Здесь вы можете найти небольшую оболочку JSON с корректирующими действиями, которая решает проблему спецификации и не-ASCI: https://stackoverflow.com/a/43694325/2254935

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...