来自有效json的json_decode语法错误

时间:2014-12-31 09:53:46

标签: 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":""}

我从我的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会替换引号,但结果相同。

编辑:

OH我的上帝。 SORRY。

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

我很惭愧。

很快就会删除这篇文章

4 个答案:

答案 0 :(得分:3)

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

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

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

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

for( $i = 0 ; $i < count($string) ; $i++ ) {
  echo 'pos: ' . $i . ' | ord: ' . ord( $string[$i] ) . ' | char: ' . $string[$i] . '<br />';
}

答案 1 :(得分:1)

在使用json_decode()之前,您必须使用UTF-8对来源进行编码 尝试使用此代码:

$json = mb_convert_encoding($json, "UTF-8");
var_dump(json_decode($json, true));

答案 2 :(得分:0)

你的有效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":""}]

答案 3 :(得分:0)

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

做到这一点的一种方法是:

$json = preg_replace('/[[:^print:]]/', '', $json);

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