8

我无法让 json_decode 处理我收到的特定字符串。

我已将其缩小到这一行:

“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]":"January+09%2C+2013+12%3A52+PM+-+First+Name+-+Changed++Billing+Address+2+From++to+Shipping+First+Name%3A% 09+Shipping+Last+Name%3A%09+Email+Address%3A%09+Shipping+Address%3A+%09+Shipping+Address+2%3A+%09+Shipping+City%3A+%09+Shipping+Zip% 2FPostal%3A+%09+Shipping+Country%3A+%09+Shipping+State%3A+%09+Phone%3A+%09+Billing+First+Name%3A+%09+Billing+Last+Name%3A+%09+Billing+地址%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
}
4

2 回答 2

9

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

删除像这里http://codepad.org/8fnQphkS这样的制表符并在 jsonlint.com 上使用它,您将看到它现在看到有效的 json。

请查看http://www.ietf.org/rfc/rfc4627.txt?number=4627上的 JSON 规范,特别是第2.5节,其中制表符按名称作为必须转义的字符之一,如果在一个字符串内。

编辑:

这是一种去除所有制表符和多个空格并用单个空格字符替换它们的方法:

$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data));
于 2013-07-24T23:33:08.030 回答
6

你尝试过这样的事情吗?这将有助于清理你的字符串

$yourstring = preg_replace('/[^(\x20-\x7F)]*/','', $yourstring);
于 2013-07-19T18:25:13.850 回答