NodeJS SyntaxError:JSON 中位置 0 的意外标记

Posted

技术标签:

【中文标题】NodeJS SyntaxError:JSON 中位置 0 的意外标记【英文标题】:NodeJS SyntaxError: Unexpected token in JSON at position 0 【发布时间】:2019-09-21 11:24:55 【问题描述】:

Authorize.net 的沙盒 API 响应的 body 是:


  "messages": 
    "resultCode": "Error",
    "message": [
      
        "code": "E00012",
        "text": "You have submitted a duplicate of Subscription 5777085. A duplicate subscription will not be created."
      
    ]
  

但是当我去解析它时:

try 
   bodyObj = JSON.parse(body);
 catch (ex) 
   console.error(ex);

我收到此错误:

SyntaxError: JSON 中位置 0 的意外标记

还有这个:console.log(response.headers['content-type']);

返回:application/json; charset=utf-8

我做错了什么?我想把 JSON 解析成一个 JS 对象。

【问题讨论】:

您的代码不能证明您声称的内容,因此至少在该 try 块之前添加一个 console.log(body),这样您就可以向自己证明 body 包含您认为/声称的内容. 【参考方案1】:

其实你没看到,但是有一个看不见的unicode字符,具体是JSON开头的字节序标记。 由于字节顺序标记不是有效的 JSON 字符,JSON.parse 拒绝了它。 要删除,请使用以下代码。

function removeByteOrderMark(str)
    return str.replace(/^\ufeff/g,"")

// OR (faster),
let removeByteOrderMark = a=>a[0]=="\ufeff"?a.slice(1):a

【讨论】:

有意思,用这个字符怎么解析? community.developer.authorize.net/t5/Integration-and-Testing/… @orangeMint 我添加了一个函数来删除这个字符到我的答案中。 @smileycreations15 你拯救了我的一天! @PatNeedham 没问题! :D【参考方案2】:

在我们正在进行的项目中,JSON.parse() 遇到了同样的问题。我们只是在使用JSON.stringfy(),并且该对象工作正常,但在我们收到数据的另一个平台上,它有类似的错误“位置 1 处 JSON 中的意外令牌”

我们是这样做的:

    在 NodeJs 中,我们使用 encodeURI() 对字符串化对象进行编码,然后将其发送 在客户端:解码字符串然后在解码后的字符串上使用JSON.parse()

分析

我尝试从该位置打印字符,然后用空字符串替换它,然后我们意识到即使在替换它们之后它也会打印其他奇怪的字符。之后我意识到这是一个 html 代码""",所以我们没有替换它,而是对它的字符串进行编码和解码。 我们在我们的案例上进行了尝试,它没有任何问题

【讨论】:

以上是关于NodeJS SyntaxError:JSON 中位置 0 的意外标记的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs JSON.parse-SyntaxError:JSON中位置0处的意外令牌u

SyntaxError:JSON.parse (<anonymous>) 处的 JSON 输入意外结束

Angular2 HTTP POST发生错误SyntaxError:JSON输入意外结束

我不知道如何解决此错误:SyntaxError:JSON.parse:JSON数据第1行第1列的意外字符

NodeJS和谐在导入时产生SyntaxError

SyntaxError:JSON.parse:意外字符在我的控制台中?