PHP JSON decode () возвращает NULL с допустимым JSON?


у меня есть этот объект 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 после webservice вызов. Мой файл JSON имел последовательность спецификаций UTF (некоторые двоичные символы, которых не должно быть), таким образом, нарушая структуру JSON. Зашел в шестнадцатеричный редактор, стер байты. Все возвращается на круги своя. Почему это произошло? потому что я редактировал файл с помощью блокнота Microsoft Windows. ужасная идея!

16 69

16 ответов:

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

обновление: проблема решена, посмотрите на пункт "решение" в вопросе.

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

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

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

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

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

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

json_decode($k)

покажет время.

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

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

мое значение JSON было сгенерировано JSON.функция преобразовать в строки.

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

json_decode(stripslashes($_POST['data']))

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

$json = utf8_encode($yourString);
$data = json_decode($json);
$k=preg_replace('/\s+/', '',$k); 

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

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

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

$jsonData = trim($jsonData);

Как заявил Юрген математика, используя метод preg_replace, указанный user2254008, исправил его и для меня.

Это не ограничивается Chrome, это, кажется, проблема преобразования набора символов (по крайней мере, в моем случае, Unicode -> UTF8) это исправило все проблемы, которые у меня были.

как будущий узел, объект JSON, который я декодировал, пришел из JSON Python.функция дампов. Это, в свою очередь, вызвало некоторые другие антисанитарные данные, чтобы сделать его поперек, хотя это было легко справиться с.

Если вы получаете json из базы данных, put

mysqli_set_charset($con, "utf8");

после определения соединения link $con

просто сохраните один раз. Я потратил 3 часа, чтобы узнать, что это была просто проблема кодирования html. Попробуйте это

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);

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

<?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;
}
?>

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

Я решил эту проблему, распечатав JSON, а затем проверив источник страницы (CTRL / CMD + U):

print_r(file_get_contents($url));

оказалось, там был трейлинг <pre> тег.

вы должны обеспечить эти пункты

1. ваша строка json не имеет каких-либо неизвестных символов

2. строка json может просматривать из онлайн-просмотра json (вы можете искать в google как онлайн-просмотрщик или парсер для json) он должен просматривать без каких-либо ошибок

3. ваша строка не имеет HTML-объектов, она должна быть простым текстом / строкой

для разъяснения пункта 3

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

до (удалить функцию htmlentities ())

$html_product_sizes_json=$html;
    $ProductSizesArr = json_decode($html_product_sizes_json,true);
<?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>";
?>