2013-07-19 80 views
7

我遇到麻烦让json_decode工作在我正在接收的特定字符串上。PHP,JSON解码中的字符无效

我已经把范围缩小到这一行:

“systemNotes [6]”:“2013年1月9日下午12时52分 - 测试名称 - 更改账单地址2从航运名字:航运姓:电子邮件地址:送货地址:送货地址2:送货城市:送货邮递区号:送货国家/地区:送货状态:电话:账单名称:帐单姓名:帐单地址:帐单地址2:帐单C“

从这个问题复制json,这个问题是不可复制的 - 但是原始json的代表片段是在这里:http://codepad.org/ZzrC7rqQ - 并把在jsonlint.com给出:

Parse error on line 3: 
... "systemNotes[6]": "January 09, 2013 12 
-----------------------^ 
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[' 

什么不对这个字符串,它是无效的JSON?

编辑

我设法找到确切的代码来跨越。

“systemNotes [6]”:“一月+ 09%2C + 2013 + 12%+ 3A52 PM ++首先+名称++ ++变更帐单+地址+ 2 +从++到+送货+首先+名称%3A%09 +运费+尾+名称%3A%09 +电子邮件+地址%3A%09 +运费+地址%3A +%09 +运费+地址+ 2%3A +%09 +运费+城市%3A +% 09 +运费+邮编%2FPostal%3A +%09 +运费+乡村%3A +%09 +运费+州立%3A +%09 +电话%3A +%09 +计费+一+名称%3A +%09 +计费+尾+名称% 3A +%09 +计费+地址%3A +%09 +计费+地址+ 2%3A +%09 +计费+ C”

这似乎是确定,所以也许问题的根源,当我做parse_str到来,这里是我使用的代码:

$response = apiConnection($data); 
parse_str($response, $parse); 
$each = json_decode($parse['data']); 
foreach($each as $key => $order){ 
    //do something 
} 
+0

你是如何收集的字符串? – aynber

+0

我正在查询一个API,它将它作为字符串发回给我。 然后我使用parse_str将其留在数组中。 – Scott

+1

你可以检查字符串是否有非UTF 8字符? –

回答

8

问题是制表符在字符串内无效。

删除像这里的标签字符http://codepad.org/8fnQphkS并使用它在jsonlint.com你会看到它看到现在有效的JSON。

查看JSON的规格参数http://www.ietf.org/rfc/rfc4627.txt?number=4627特殊部分2.5其中标签字符是通过名称作为必须在字符串内部转义的字符之一调用的。

编辑:

这里是剥离出所有的选项卡和多个空格,并用一个空格字符替换其中的一种方式:

$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data)); 
+0

虽然,在他去除url编码之前,他会更好地解码json *。 –

+1

'$ data = preg_replace('/ [\ s] + | [\ t] /','',trim($ data));' - 所有类型的空格 – ASDi

4

你试过类似的东西吗?这将有助于清洁你的字符串

$yourstring = preg_replace('/[^(\x20-\x7F)]*/','', $yourstring); 
-1

尝试通过true为json_decode第二个参数。根据Documentation,它将返回一个关联数组而不是具有第二个参数的对象为true。

$each = json_decode($parse['data'], true); 
+0

这个标志是关于检索数组或std类的 – HMagdy