JSON.parse为什么会失败呢?

我使用如下的文件作为数据,然后让JSON.parse进行解析,但失败了,这个问题困扰我一天了。哪位能指点迷津?

我把代码放到了这里

git clone https://gitee.com/triphop/weird_json_parsing.git

需要解析的数据如下

 ~/tmp/x/segment $ cat feed.dat 
{\"deliveryInfo\":{\"logisticsName\":\"\u2014\",\"sellerNick\":\"ltbbtl\",\"tspInfo\":{},\"address\":\"\u9053 \u5317\u4EAC\u5E02\u976291\u7A7A\u95F4136\u5BA4 \uFF0C100032\",\"showLogistics\":true,\"shipType\":\"\u5FEB\u9012\",\"logisticsNum\":\"\u2014\",\"showTSP\":false,\"asyncLogisticsUrl\":\"\/\/detail.i56.taobao.com\/call\/queryTrace.do?dimension=TRADE_ID&tradeId=62298565722066429\"} }
 ~/tmp/x/segment $

解析用的JavaScript代码

~/tmp/x/segment $ cat question.js
'use strict';

const util = require('util');
const fs = require('fs');

const raw = fs.readFileSync('./feed.dat', { encoding: 'utf8' });
console.log('----------------------  raw   ----------------------------');
console.log(raw);
console.log('---------------------- object ----------------------------');
console.log(util.inspect(JSON.parse(raw), { colors: true }));
 ~/tmp/x/segment $ 

运行后的出错信息如下

 ~/tmp/x/segment $ node question.js
----------------------  raw   ----------------------------
{\"deliveryInfo\":{\"logisticsName\":\"\u2014\",\"sellerNick\":\"ltbbtl\",\"tspInfo\":{},\"address\":\"\u9053 \u5317\u4EAC\u5E02\u976291\u7A7A\u95F4136\u5BA4 \uFF0C100032\",\"showLogistics\":true,\"shipType\":\"\u5FEB\u9012\",\"logisticsNum\":\"\u2014\",\"showTSP\":false,\"asyncLogisticsUrl\":\"\/\/detail.i56.taobao.com\/call\/queryTrace.do?dimension=TRADE_ID&tradeId=62298565722066429\"} }

---------------------- object ----------------------------
undefined:1
{\"deliveryInfo\":{\"logisticsName\":\"\u2014\",\"sellerNick\":\"ltbbtl\",\"tspInfo\":{},\"address\":\"\u9053 \u5317\u4EAC\u5E02\u976291\u7A7A\u95F4136\u5BA4 \uFF0C100032\",\"showLogistics\":true,\"shipType\":\"\u5FEB\u9012\",\"logisticsNum\":\"\u2014\",\"showTSP\":false,\"asyncLogisticsUrl\":\"\/\/detail.i56.taobao.com\/call\/queryTrace.do?dimension=TRADE_ID&tradeId=62298565722066429\"} }
 ^

SyntaxError: Unexpected token \ in JSON at position 1
    at JSON.parse (<anonymous>)
    at Object.<anonymous> (/home/hyan/tmp/x/segment/question.js:10:31)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.runMain (module.js:605:10)
    at run (bootstrap_node.js:420:7)
    at startup (bootstrap_node.js:139:9)

可如果我这样操作就没问题

 ~/tmp/x/segment $ node
> const raw = `{\"deliveryInfo\":{\"logisticsName\":\"\u2014\",\"sellerNick\":\"ltbbtl\",\"tspInfo\":{},\"address\":\"\u9053 \u5317\u4EAC\u5E02\u976291\u7A7A\u95F4136\u5BA4 \uFF0C100032\",\"showLogistics\":true,\"shipType\":\"\u5FEB\u9012\",\"logisticsNum\":\"\u2014\",\"showTSP\":false,\"asyncLogisticsUrl\":\"\/\/detail.i56.taobao.com\/call\/queryTrace.do?dimension=TRADE_ID&tradeId=62298565722066429\"} }
... `;
undefined
> JSON.parse(raw)
{ deliveryInfo: 
   { logisticsName: '—',
     sellerNick: 'ltbbtl',
     tspInfo: {},
     address: '道 北京市面91空间136室 ,100032',
     showLogistics: true,
     shipType: '快递',
     logisticsNum: '—',
     showTSP: false,
     asyncLogisticsUrl: '//detail.i56.taobao.com/call/queryTrace.do?dimension=TRADE_ID&tradeId=62298565722066429' } }
> 

这到底是为啥啊???

阅读 17.4k
7 个回答

手动输入的打印出来是没有转义符号\的,从文件读取出来,然后打印的是有\,所以手动测试的是正常的。
但是原因不清楚,可以暂时将所有无用的\去掉,除了\u

raw = raw.replace(/\\([^u])/g, '$1')

console.log(JSON.parse(raw))
console.log(util.inspect(JSON.parse(raw.split('\\"').join('"')), { colors: true }));

试下这个?应该是需要将双引号的转义全部去掉。

你写到文件的时候去掉\肯定就可以了

不会啊,亲测有效

clipboard.png

var str = "{\"deliveryInfo\":{\"logisticsName\":\"\u2014\",\"sellerNick\":\"ltbbtl\",\"tspInfo\":{},\"address\":\"\u9053 \u5317\u4EAC\u5E02\u976291\u7A7A\u95F4136\u5BA4 \uFF0C100032\",\"showLogistics\":true,\"shipType\":\"\u5FEB\u9012\",\"logisticsNum\":\"\u2014\",\"showTSP\":false,\"asyncLogisticsUrl\":\"\/\/detail.i56.taobao.com\/call\/queryTrace.do?dimension=TRADE_ID&tradeId=62298565722066429\"} }";
str
var obj = JSON.parse(str);
新手上路,请多包涵

拿到的数据拼接 ''

const raw = fs.readFileSync('./feed.dat', { encoding: 'utf8' })
util.inspect(JSON.parse(raw), { colors: true })

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题