我遇到了从节点中的流反序列化的问题(特别是来自比特币GOX交换的定价Feed)。基本上是一个块来到格式良好的完整和验证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));
});
尝试解析时,我得到以下内容
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" }}
您可以在此处验证:http://jsonlint.com
另外值得一提的是我已经尝试过解析和删除转义的字符。还尝试了几个具有相同结果的不同序列化程序
答案 0 :(得分:1)
您正在通过块获取数据块。块本身可能不是完整的JSON对象。要么缓冲所有数据,要么使用某些东西为你做(比如request
模块),或者如果你需要解析长流,请看一下JSONparse
模块。
答案 1 :(得分:1)
你得到两个单独的块(或者至少:这是我在重新创建你的问题时得到的)。一个(第一个)是有效的JSON对象,而另一个(第二个)是“几乎为空”:它是一个1字节的字符串,只包含LF
(ASCII 0x0a)。
当然,第二个解析失败了。
阅读我的第一个回答:这正是这种情况。如果将两个块连接在一起,则会得到一个尾随LF
的完整JSON对象,轻松传递JSON.parse()
。但是,如果尝试单独解析块,则第一个成功(尾随LF
不是必需的)而第二个失败(LF
本身不是有效的JSON对象)。
对于您的情况,您必须:
1)假设Mt.Gox总是以“这种方式”发送数据,忽略那些“几乎空”的块,并仅解析“非空”块。
2)或者使用解析JSON流的JSONparse
。