1

我在从节点中的流反序列化时遇到问题(特别是来自比特币 GOX 交易所的定价提要)。基本上到达了一个完整且经过验证的 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

另外值得一提的是,我已经尝试过解析和删除转义字符。还尝试了几个不同的序列化器,结果相同

4

2 回答 2

2

您正在逐块获取数据。块本身可能不是完整的 JSON 对象。要么缓冲所有数据,要么使用一些东西为你做这件事(比如request模块),或者如果你需要解析一个长流,请查看JSONparse模块。

于 2013-10-09T16:46:53.100 回答
1

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

当然,第二个解析失败。

阅读我的第一个答案:正是这种情况。如果您将这两个块连接在一起,您将获得一个完整的 JSON 对象,带有一个尾随LF、容易传递的JSON.parse(). 但是,如果您尝试单独解析块,则第一个成功(尾随LF不是强制性的),而第二个失败(LF本身不是有效的 JSON 对象)。

对于您的情况,您必须:

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

2) 或者使用JSONparsewhich 解析 JSON 流。

于 2013-10-21T05:50:56.537 回答