Подтвердить что ты не робот

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 BOM (некоторые двоичные символы, которые не должны быть там), таким образом, нарушая структуру JSON. Пошел в Hex Editor, удалил байты. Все в порядке. Почему это произошло? Потому что я редактировал файл с помощью Microsoft Windows 'Notepad. Ужасная идея!

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Вы можете очистить его, используя

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

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

json_decode($k)

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

Ответ 4

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

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

Ответ 5

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

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

Значение моего JSON генерировалось функцией JSON.stringify.

Ответ 6

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

$json = utf8_encode($yourString);
$data = json_decode($json);

Ответ 7

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

сделал это для меня. И да, тестирование в Chrome. спасибо to user2254008

Ответ 8

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

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

$jsonData = trim($jsonData);

Ответ 9

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

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

Ответ 10

Как указано Jürgen Math, используя метод preg_replace, указанный пользователем2254008, он исправил его и для меня.

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

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

Ответ 11

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

mysqli_set_charset($con, "utf8");

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

Ответ 12

Просто сохраните один раз. Я потратил 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);

Ответ 13

Здесь вы можете найти небольшую обертку JSON с корректирующими действиями, которые устраняют проблему спецификации и не-ASCI: fooobar.com/questions/100087/...

Ответ 14

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

print_r(file_get_contents($url));

Выключился трейлинг-тег <pre>.

Ответ 15

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

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

2. json string может просматривать из онлайн-просмотра 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);

Ответ 16

Для моего случая это из-за одинарных кавычек в строке JSON.

Формат JSON принимает только двойные кавычки для ключей и строковых значений.

Пример:

$jsonString = '{\'hello\': \'PHP\'}'; // valid value should be '{"hello": "PHP"}'
$json = json_decode($jsonString);
print $json; // null

Я запутался из-за синтаксиса Javascript. В Javascript, конечно, мы можем сделать так:

let json = {
    hello: 'PHP' // no quote for key, single quote for string value
}

// OR:
json = {
    'hello': 'PHP' // single quote for key and value
}

но позже, когда преобразовать эти объекты в строку JSON:

JSON.stringify(json); // "{"hello":"PHP"}"

Ответ 17

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