从一个stream的NodeJS反序列化

我有一个问题从节点中的stream反序列化(特别是来自比特币GOX交换的定价供给)。 基本上一个大块到达,这是完整的,并validation了JSON 。 这里是代码:

var gox = require('goxstream'); var fs = require('fs'); var options = { currency: 'AUD', ticker: true, depth: false }; var goxStream = gox.createStream(options); goxStream.on('data', function(chunk) { console.log(JSON.parse(chunk)); }); 

当试图parsing它,我得到以下

 undefined:0 ^ SyntaxError: Unexpected end of input 

有任何想法吗? 我已经包括一个样本块:

 > {"channel": "eb6aaa11-99d0-4f64-9e8c-1140872a423d", "channel_name": > "ticker.BTCAUD", "op": "private", "origin": "broadcast", "private": > "ticker", "ticker": { > "high": { > "value": "121.51941", > "value_int": "12151941", > "display": "AU$121.51941", > "display_short": "AU$121.52", > "currency": "AUD" > }, > "low": { > "value": "118.00001", > "value_int": "11800001", > "display": "AU$118.00001", > "display_short": "AU$118.00", > "currency": "AUD" > }, > "avg": { > "value": "119.58084", > "value_int": "11958084", > "display": "AU$119.58084", > "display_short": "AU$119.58", > "currency": "AUD" > }, > "vwap": { > "value": "119.80280", > "value_int": "11980280", > "display": "AU$119.80280", > "display_short": "AU$119.80", > "currency": "AUD" > }, > "vol": { > "value": "249.73550646", > "value_int": "24973550646", > "display": "249.73550646\u00a0BTC", > "display_short": "249.74\u00a0BTC", > "currency": "BTC" > }, > "last_local": { > "value": "118.50000", > "value_int": "11850000", > "display": "AU$118.50000", > "display_short": "AU$118.50", > "currency": "AUD" > }, > "last_orig": { > "value": "108.99500", > "value_int": "10899500", > "display": "$108.99500", > "display_short": "$109.00", > "currency": "USD" > }, > "last_all": { > "value": "118.79965", > "value_int": "11879965", > "display": "AU$118.79965", > "display_short": "AU$118.80", > "currency": "AUD" > }, > "last": { > "value": "118.50000", > "value_int": "11850000", > "display": "AU$118.50000", > "display_short": "AU$118.50", > "currency": "AUD" > }, > "buy": { > "value": "118.50000", > "value_int": "11850000", > "display": "AU$118.50000", > "display_short": "AU$118.50", > "currency": "AUD" > }, > "sell": { > "value": "119.99939", > "value_int": "11999939", > "display": "AU$119.99939", > "display_short": "AU$120.00", > "currency": "AUD" > }, > "item": "BTC", > "now": "1376715241731341" }} 

你可以在这里validation它: http : //jsonlint.com

也可能值得一提的是我已经尝试parsing和删除转义字符。 也尝试了几个不同的序列化器具有相同的结果

你会得到两个单独的块(或者至less是:这是我重新创build您的问题时得到的)。 一个(第一个)是一个有效的JSON对象,而另一个(第二个)是“几乎空的”:它是一个只包含LF (ASCII 0x0a)的1字节string。

当然,第二个parsing失败。

阅读我的第一个答案:这正是如此。 如果将这两个块连接在一起,就会得到一个带有尾随LF的完整JSON对象,并很容易地传递JSON.parse() 。 但是,如果尝试单独parsing块,但第一个成功(尾随LF不是强制性的),而第二个失败( LF本身不是有效的JSON对象)。

对于你的情况,你将不得不:

1)假设Mt.Gox总是以这种方式发送数据,忽略那些“几乎空”的块,只parsing“非空”的块。

2)或者使用parsingJSONstream的JSONparse

您正在通过块获取数据 。 块本身可能不是完整的JSON对象。 要么缓冲所有的数据,要么用一些东西来为你做(比如说request模块),或者如果你需要parsing一个长的stream,看看JSONparse模块。