来自有效 json 的 json_decode 语法错误

FLX*_*FLX 0 php json

我有这个简单的 JSON 字符串:

{"type_voie":"ALL","indice_repetition":"B","num_voie":"1","nom_voie":"Azrty","infos_voie":"Zzz","distribution_speciale":"","cp":"34230","ville":"PLAISSAN","bureau_distributeur":""}
Run Code Online (Sandbox Code Playgroud)

我从我的 utf8 数据库中得到的。

当我将它传递给 时json_decode($json, true),结果为 NULL 并json_last_error()给我 4 (JSON_ERROR_SYNTAX)

如果我执行 mb_detect_encoding,我可以看到字符串是 ASCII,但我只在任何地方使用 UTF-8。

该字符串最初是从 AJAX 查询插入到数据库中的。我从使用 jQuery 函数 serialize() 序列化的表单中获取日期。

我在我的项目中做了很多这样的事情,从来没有遇到过这样的问题。

我尝试使用 iconv、mb_convert_encoding 或 ut8_encode 强制使用 UTF8,但没有任何改变。

我也尝试过,html_entity_decode()因为有时 PDO 会替换引号,但结果相同。

编辑 :

我的天啊。对不起。

由于某些原因,
在我获得 json 和我将它发送到解析器的那一刻之间连接了a 。只有PEBKAC....

我很惭愧。

会尽快删除此贴

小智 10

正如人们在之前的答案中指出的那样,json 中可能存在不可打印的字符,这意味着它们应该在调用 json_decode 之前删除。

一种方法是这样的:

$json = preg_replace('/[[:^print:]]/', '', $json);
Run Code Online (Sandbox Code Playgroud)

我并不是说这是最好的解决方案,但到目前为止,我发现这是唯一对我有用的解决方案。


Eri*_*rik 7

正如我们在注释中发现字符串中存在不可见字符,请考虑运行这段代码。它应该显示字符串中的每个字符,它是 ascii 值,它是打印版本。

那里应该有几个字符不打印任何内容;这些是阻止您对字符串进行 json_encoding 的那些。我看不出它们为什么在字符串中,这与您的数据库和您发布到其中的数据有关,但至少您会知道问题出在哪里

很可能它们包含在插入数据中的某处,这意味着您可能在某处有一段代码,向其输入添加了不可打印的内容。

您可以在导出时剥离它们,但最好找出哪些代码添加了它们并将它们从数据库中删除。否则,他们将来会继续打扰您。(正如您在这一点上看到的,由于这些字符,即使像 strlen() 这样简单的东西也无法正常工作)

for( $i = 0 ; $i < mb_strlen($string) ; $i++ ) {
  echo 'pos: ' . $i . ' | ord: ' . ord( $string[$i] ) . ' | char: ' . $string[$i] . '<br />';
}
Run Code Online (Sandbox Code Playgroud)