我有一个使用chrome.sockets
的应用程序。JSON正在从套接字传递到套接字,该套接字没有分隔符,也没有以字符串长度为前缀。
现在在chrome.sockets
中读取套接字的方式是通过传递最大缓冲区长度,它将读取所有可用的字节,直到缓冲区满。socket.read
的文档可以在这里找到
缺少编写/移植解析器,是否有一个JavaScript JSON解析器,我可以简单地在socket.read
的响应管道?
你看过https://github.com/creationix/jsonparse吗?看起来它假设了一个Node.js环境,但它不像它会很难调整API来满足您的需求。
更新:由于您需要检查JS是否有效,您可以使用JSON。解析来检查它是否是有效的JSON,这应该总是在Chrome中可用。您可以将arraybuffer转换为字符串,并将其附加到累加器字符串上,并在每次迭代后对该字符串执行以下检查。
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);