我遇到麻烦让json_decode处理我收到的特定字符串。
我已将其缩小到这一行:
“systemNotes [6]”:“2013年1月9日12:52 - 测试名称 - 更改结算地址2从发货名称:发货姓氏:电子邮件地址:发货地址:发货地址2:发货城市:运送邮编/邮政:运输国家:运输状态:电话:结算名字:账单姓:Billing地址:账单地址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 :(得分:8)
问题是制表符在字符串中无效。
删除像http://codepad.org/8fnQphkS这样的标签字符,并在jsonlint.com上使用它,你会看到它现在看到有效的json。
在http://www.ietf.org/rfc/rfc4627.txt?number=4627特别是 2.5 部分查看JSON的规范,其中制表符按名称调出,作为字符串中必须转义的字符之一。
编辑:
这是一种剥离所有标签和多个空格并用一个空格字符替换它们的方法:
$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data));
答案 1 :(得分:5)
$yourstring = preg_replace('/[^(\x20-\x7F)]*/','', $yourstring);
答案 2 :(得分:-2)
尝试将true
作为第二个参数传递给json_decode。根据{{3}},它将返回一个关联数组,而不是一个第二个参数为true的对象。
$each = json_decode($parse['data'], true);