2013-08-18 3 views
1

У меня возникла проблема десериализации из потока в узле (в частности, фид ценообразования из обмена биткойн GOX). В принципе, кусок прибывает, который составляет хорошо сформированный полный и проверенный JSON. Вот код:Удаление десериализации NodeJS из потока

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

Кроме того, вероятно, стоит отметить, я уже пытался синтаксический и удаление экранированных символов. Также попробовали пару разных сериализаторов с теми же результатами

ответ

1

Вы получаете два отдельных куска (или, по крайней мере: это то, что я получаю при повторном создании вашей проблемы). Один (первый) является действительным объектом JSON, а второй (второй) «почти пустым»: это 1-байтовая строка, содержащая только LF (ASCII 0x0a).

Второе, конечно, не удается разобрать.

Прочтите мой первый ответ: это именно такой случай. Если вы объедините два куска вместе, вы получите полный объект JSON с конечным LF, легко пройдя JSON.parse(). Однако, если вы попытаетесь разобрать куски отдельно, однако, первый из них преуспевает (завершающий LF не является обязательным), а второй - неудачным (один из LF сам по себе не является допустимым объектом JSON).

В вашем случае, вы должны:

1) Либо предположим Mt.Gox всегда посылает данные «таким образом», игнорировать эти «почти пустые» куски, и разобрать только «не пустые» куски.

2) Или используйте JSONparse, который анализирует потоки JSON.

1

Вы получаете данные кусок на куске. Сами кучи могут быть неполными объектами JSON. Либо буферизуйте все данные, либо используйте что-нибудь для этого (скажем, модуль request), или если вам нужно проанализировать длинный поток, посмотрите на модуль JSONparse.

+0

Куски завершены в соответствии с дампом данных, который я дал. – Slappy

+0

Не совсем. См. Мой новый ответ. –