我有一个正在使用的应用程序chrome.sockets
。JSON 正在传入和传出套接字,该套接字没有分隔符并且没有以字符串长度为前缀。
现在读取套接字的方式chrome.sockets
是传递最大缓冲区长度,它将读取所有可用字节,直到缓冲区已满。的文档socket.read
可以在这里找到
缺少编写/移植解析器,是否有一个 JavaScript JSON 解析器,我可以在其中简单地输入来自的响应socket.read
?
我有一个正在使用的应用程序chrome.sockets
。JSON 正在传入和传出套接字,该套接字没有分隔符并且没有以字符串长度为前缀。
现在读取套接字的方式chrome.sockets
是传递最大缓冲区长度,它将读取所有可用字节,直到缓冲区已满。的文档socket.read
可以在这里找到
缺少编写/移植解析器,是否有一个 JavaScript JSON 解析器,我可以在其中简单地输入来自的响应socket.read
?
更新:由于您需要检查 JS 是否有效,您可以使用 JSON.parse 来检查它是否是有效的 JSON,这在 Chrome 中应该始终可用。您可以将数组缓冲区转换为字符串并将其附加到累加器字符串上,并在每次迭代后对该字符串执行以下检查。
function isValidJSON(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
};
// assuming 16bit uint unicode chars
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
以下是您可以使用的示例回调函数:
jsonData = "";
function readJSONFromSocket(object readInfo) {
// Arraybuffer to string
partialJSONData = ab2str(readInfo.data);
// Loop through the chars until we get a valid JSON object
for (var x = 0; x < partialJSONData.length; x++) {
// Build up the JSON character by character
jsonData += partialJSONData.charAt(x);
if (isValidJSON(jsonData)) {
console.log(jsonData);
// Do something here
jsonData = "";
}
}
};
我知道这个问题是不久前发布的,但这是处理这个问题的好方法。
安装Node JS,安装NPM(Node Package Manager)
npm install -g browserify
npm install -g JSONStream
echo "window.JSONStream = require('JSONStream');" > script.js
browserify script.js jsonstream.js
在您的网页中
var parseStream = new JSONStream('*');
while (var buffer = socket.read()) {
parseStream.write(buffer);
}
parseStream.on('data', function (obj) {
// obj is a parsed obj
})
现在,如果您想要管道方法,因为您是 unix 的粉丝。然后加
npm install shoe
shoe('./socketName').pipe(parseStream);
你见过https://github.com/creationix/jsonparse吗?看起来它假设一个 Node.js 环境,但它不喜欢调整 API 以满足您的需求。