从 websocket 过滤 json 对象/值并打印到控制台日志

Posted

技术标签:

【中文标题】从 websocket 过滤 json 对象/值并打印到控制台日志【英文标题】:filter json object/value from websocket and print to console log 【发布时间】:2019-04-25 16:48:40 【问题描述】:

尝试从 websocket 提供的 json 数据中打印到控制台记录一个值

下面的代码将 websocket 中的所有 json 数据打印到控制台日志。

// require ws
const WebSocket = require('ws');


//messsage sent to  ws server
var msg = 
    "jsonrpc": "2.0",
     "method": "public/subscribe",
     "id": 42,
     "params": 
        "channels": ["price_index.btc_usd"]
    ;

// WS connection url
var ws = new WebSocket('wss://website.com/ws/api/v2');

//ws response
ws.onmessage = function (e) 

    // do something with the notifications...

    console.log('server : ', e.data);

;

//stringify json data
ws.onopen = function () 
    ws.send(JSON.stringify(msg));
;

预期结果:

server :  5457.21

server :  5457.19

server :  5457.15

实际结果:

server :  "jsonrpc":"2.0","method":"subscription","params":"channel":"deribit_price_index.btc_usd","data":"timestamp":1556209117657,"price":5457.21,"index_name":"btc_usd"
server :  "jsonrpc":"2.0","method":"subscription","params":"channel":"deribit_price_index.btc_usd","data":"timestamp":1556209117657,"price":5457.19,"index_name":"btc_usd"

【问题讨论】:

以上代码取自网站示例本身here 【参考方案1】:

JSON.parse()

你可以这样使用它:

    //This will turn it into an object you can navigate with '.params.data.price'
    try 
        console.log('server: ', JSON.parse(e.data).params.data.price);
     catch 

【讨论】:

虽然这确实会删除其他数据,但它不允许新的价格进入提要。它只是重复相同的数据。我试着稍微改变你的建议,但仍然没有奏效。它只是不断重复“服务器:5457.19” 您需要省略 var e = ... 行——这只是您的问题的输出,它覆盖了传递给函数的 e 参数的值。他包括那行只是为了让他的 sn-p 工作。 数据仅在更新时传递。每次“更新”它只是重复硬编码值。我尝试使用您的替代品,但它也不起作用:'((省略了 var e = ...) 您能否发布更新后的代码,以便我们查看是否还有其他内容潜入? 是的,它仍然有效 :'( 不确定你是否可以在编辑器上尝试它,你会看到原始作品,但你的会抛出错误 :'(【参考方案2】:

你正在记录e.data中的所有内容。

从实际结果json看,你想要e.data.params.data.price

正如Robofan所说,你需要先解析它。

console.log('server : ', e.data); -> console.log('server : ', JSON.parse(e).params.data.price);

【讨论】:

不幸的是,这会从 websocket 接口本身返回多行,例如: server : MessageEvent target: WebSocket _events: [Object: null prototype] message: [Function], open: [Function] , _eventsCount:2,_maxListeners:未定义,readyState:1,协议:'',_binaryType:'nodebuffer',_closeFrameReceived:false,_closeFrameSent:false,

以上是关于从 websocket 过滤 json 对象/值并打印到控制台日志的主要内容,如果未能解决你的问题,请参考以下文章

无法从 websocket 消息对象获取 json 值

如何从对象类型中动态获取值并在扩展面板角材料中实现?

怎样从对象中获取键值并保存在对象中

子查询 django 查询以从对象中获取最大的不同值并返回这些对象

使用 Json Python 格式化 Websocket 数据

从 coredata 中过滤值并分配给 tableview