Parsing JSON stream

Parsing JSON stream

本文关键字:stream JSON Parsing      更新时间:2023-09-26

我有一个使用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);