2

我有一个正在使用的应用程序chrome.sockets。JSON 正在传入和传出套接字,该套接字没有分隔符并且没有以字符串长度为前缀。

现在读取套接字的方式chrome.sockets是传递最大缓冲区长度,它将读取所有可用字节,直到缓冲区已满。的文档socket.read可以在这里找到

缺少编写/移植解析器,是否有一个 JavaScript JSON 解析器,我可以在其中简单地输入来自的响应socket.read

4

3 回答 3

0

更新:由于您需要检查 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 = "";
        }
    }       
};
于 2013-05-17T15:57:26.253 回答
0

我知道这个问题是不久前发布的,但这是处理这个问题的好方法。

安装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);
于 2014-01-30T14:51:34.603 回答
0

你见过https://github.com/creationix/jsonparse吗?看起来它假设一个 Node.js 环境,但它不喜欢调整 API 以满足您的需求。

于 2013-05-17T16:11:25.287 回答