我遇到麻烦让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', '{', '['
Run Code Online (Sandbox Code Playgroud)
这个字符串有什么问题,这是无效的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
}
Run Code Online (Sandbox Code Playgroud)
问题是制表符在字符串中无效.
删除像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));
Run Code Online (Sandbox Code Playgroud)
你尝试过类似的东西吗?这将有助于清洁您的琴弦
$yourstring = preg_replace('/[^(\x20-\x7F)]*/','', $yourstring);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6341 次 |
| 最近记录: |