Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解码请求后数据的Javascript JSON解析问题_Javascript_Node.js_Json - Fatal编程技术网

解码请求后数据的Javascript JSON解析问题

解码请求后数据的Javascript JSON解析问题,javascript,node.js,json,Javascript,Node.js,Json,我获取base64数据作为POST请求的答案 它的解码方式如下(基于RESTAPI的文档): 问题: console.log(JSON.parse(data)) -> SyntaxError: Unexpected token in JSON at position 1 我尝试通过replace(/\s/g,'')删除所有白色字符,尝试用toString(“utf8”)解码,等等。 没什么帮助。唯一有帮助的是上面描述的奇怪的错误长度。您的缓冲区是UTF-16编码的,包含\0字节,如{·

我获取base64数据作为POST请求的答案

它的解码方式如下(基于RESTAPI的文档):

问题:

console.log(JSON.parse(data)) -> SyntaxError: Unexpected token  in JSON at position 1
我尝试通过replace(/\s/g,'')删除所有白色字符,尝试用toString(“utf8”)解码,等等。
没什么帮助。唯一有帮助的是上面描述的奇怪的错误长度。

您的缓冲区是UTF-16编码的,包含
\0
字节,如
{·“·C·o·d·e·”·=·…
(其中
·表示
\0
),这就是为什么它是预期长度的两倍。使用
console.log()
输出缓冲区时,
\0
字节不打印,这就是为什么输出似乎是正确的

在JSON解析缓冲区之前对其进行解码

var buffer = Buffer.from(base64, "base64");
var str = buffer.toString('utf16le');

console.log(str)                // -> {"Code":200,"Value":"8e286fdb-aad2-43c6-87b1-1c6c0d21808a","Route":""}
console.log(str.length)         // -> 70

console.log(JSON.parse(str))    // -> { Code: 200, Value: '8e286fdb-aad2-43c6-87b1-1c6c0d21808a', Route: '' }

一般来说,不要将缓冲区当作字符串来使用。缓冲区总是以某种方式编码的,这是它们与字符串的基本区别。在将其内容输出为文本之前,您必须对它们进行解码。

谢谢!没有想到utf16的可能性。@Samo双长度是一个致命的漏洞。还有
\0在JS字符串中是合法的,但在JSON中是不合法的,这就是为什么
JSON.parse()
失败的原因。它在位置1处失败告诉您UTF-16的字节顺序,在本例中是小端数
{·“·C·o·d·e·
,即
utf16le
。不太常见的大端数变体
{··”·C·o·d·e
将在位置0处解析失败。
var buffer = Buffer.from(base64, "base64");
var str = buffer.toString('utf16le');

console.log(str)                // -> {"Code":200,"Value":"8e286fdb-aad2-43c6-87b1-1c6c0d21808a","Route":""}
console.log(str.length)         // -> 70

console.log(JSON.parse(str))    // -> { Code: 200, Value: '8e286fdb-aad2-43c6-87b1-1c6c0d21808a', Route: '' }