我有这个简单的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 ....
我很惭愧。
很快就会删除这篇文章
答案 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);
我并不是说这是最好的解决方案,但到目前为止,我发现唯一对我有用的解决方案。