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 ]

1 голос
/ 01 ноября 2015

Просто сохраните хоть один раз. Я потратил 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);
1 голос
/ 18 ноября 2014

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

mysqli_set_charset($con, "utf8");

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

1 голос
/ 20 июня 2013

Как сказал Юрген Матх с помощью метода preg_replace, указанного пользователем user2254008, это исправило и для меня.

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

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

0 голосов
/ 12 марта 2017

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

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);
0 голосов
/ 31 октября 2016

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

print_r(file_get_contents($url));

Оказалось, что есть тэг <pre>.

0 голосов
/ 03 августа 2013
<code><?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 "
"; ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...