2013-05-17 93 views
2

我有一個應用程序正在使用chrome.sockets。 JSON傳入和傳出的套接字沒有分隔符,也沒有以字符串的長度作爲前綴。解析JSON流

現在,在chrome.sockets中讀取套接字的方式是傳遞最大緩衝區長度,它將讀取所有可用字節,直到緩衝區滿。可以找到socket.read的文檔here

寫入/移植解析器的缺點,是否存在JavaScript JSON解析器,我可以簡單地在socket.read的響應中管道?

回答

0

更新:由於您需要檢查JS是否有效,您可以使用JSON.parse來檢查它是否爲有效的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 = ""; 
     } 
    }  
}; 
+2

我想你可能錯過了一個把戲。 'readInfo.data'的類型是'ArrayBuffer',它只是一個字節數組。您首先需要使用任何編碼將其轉換爲文本,然後轉換爲JSON對象......我遇到的問題是知道何時有完整的JSON對象字符串,因此需要解析器。 – Cheetah

+0

好的,一旦你已經轉換爲字符串,你可以使用我在更新中添加的函數來檢查它是否有效,它應該是無效的,直到你收到整個對象。 – silleknarf

+1

......但是這回到了我在OP中討論的全部問題......我怎麼知道我什麼時候有完整的對象。在第一個緩衝區中,我可以得到'{.....',在第二個緩衝區中,我得到'..} {...} {...'。我無法抽出一個完整的對象......沒有解析器,這使我們回到原來的問題。 – Cheetah

0

我知道這個問題是前一段時間發佈的,但這裏是處理這個問題的好方法。

安裝節點JS,如果你想管的方法,因爲你的UNIX的粉絲在網頁上安裝NPM(節點包管理器)

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 
}) 

。然後添加

npm install shoe 

shoe('./socketName').pipe(parseStream);