如何解析pusher.com的“序列化” json into qt5 QJsonDocument? [英] How to parse pusher.com's "serialized" json into qt5 QJsonDocument?

查看:244
本文介绍了如何解析pusher.com的“序列化” json into qt5 QJsonDocument?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从一个pusher.com WebSocket获取一些json数据在我的qt5应用程序,我正在努力解析他们发送的序列化json。我终于找到了问题,但我不知道如何解决它:



我做了一个小测试程序来演示:

  QString str1 ={\event\:\message\,\data\:\{\\\ \\\channel\\\:\\\trade.3 \\\,\\\trade\\\:{\ \\tradeid\\\:\\\86364698\\\,\\\timestamp\\\:1425420405,\ \\datetime\\\:\\\2015-03-03 17:06:45 EDT\\\,\\\marketid\ \\:\\\3 \\\,\\\marketname\\\:\\\LTC \\ \\ / BTC \\\,\\\quantity \\\:\\\0.24680554\\\,\\ \price\\\:\\\0.00694988\\\,\\\total \\\:\\\ 0.00171527\\\,\\\type\\\:\\\Buy\\\}} \,\ channel\:\trade.3\}; 

QString str2 ={\event\:\message\,\data\:{\channel\:\trade .3 \,\trade\:{\tradeid\:\86364698\,\timestamp\:1425420405,\datetime\:\\ \\2015-03-03 17:06:45 EDT\,\marketid\:\3\,\marketname\:\LTC \\ / BTC \,\quantity\:\0.24680554\,\price\:\0.00694988\,\total\:\0.00171527 \\,\type\:\Buy\}},\channel\:\trade.3 \}

QJsonDocument doc1 = QJsonDocument :: fromJson(str1.toUtf8());
QJsonDocument doc2 = QJsonDocument :: fromJson(str2.toUtf8());

qDebug(%s,qPrintable(QString(Str1:\%1 \)arg(str1)));
qDebug(%s,qPrintable(QString(doc1toJson())));
qDebug()<< ------------------------------------------------- ----------;
qDebug(%s,qPrintable(QString(Str2:\%1 \)arg(str2)));
qDebug(%s,qPrintable(QString(doc2.toJson())));

这会输出:

  Str1:{event:message,data:{\channel\:\trade.3 \,\trade\ {\tradeid\:\86364698\,\timestamp\:1425420405,\datetime\:\2015-03-03 17:06:45 EDT\\ \\,\marketid \:\3 \,\marketname\:\LTC \\ / BTC \,\quantity \:\\ \\0.24680554 \,\price\:\0.00694988\,\total\:\0.00171527\,\type\:\ Buy\}},channel:trade.3}
{
channel:trade.3,
data:{\ channel\:\trade.3 \,\trade\:{\tradeid\:\86364698\,\timestamp\:1425420405 ,\datetime\:\2015-03-03 17:06:45 EDT\,\marketid\:\3\,\marketname\ :\LTC \\ / BTC \,\quantity\:\0.24680554\,\price\:\0.00694988\,\ total \:\0.00171527\,\type\:\Buy\}},
event:message
}

-------------------------------------------- ---------------
Str2:{event:message,data:{channel:trade.3,trade: {tradeid:86364698,timestamp:1425420405,datetime:2015-03-03 17:06:45 EDT,marketid:3,marketname:LTC \ / BTC,quantity:0.24680554,price:0.00694988,total:0.00171527,type:Buy}},channel:trade.3 $ b {
channel:trade.3,
data:{
channel:trade.3,
trade:{
datetime:2015-03-03 17:06:45 EDT,
marketid:3,
marketname:LTC / BTC,
price:0.00694988,
quantity:0.24680554,
timestamp:1425420405,
total:0.00171527,
tradeid :86364698,
type:Buy
}
},
event:message
}

显然第二个版本是我的目标。有一种方法可以轻松地转换输入数据,或者我将不得不尝试和滚动我自己的转换器功能?



编辑:以下是关于这个特定数据样本...但我仍然认为必须有一个更适当的方式来转换这种东西...

  str1.replace(\\\,\); 
str1.replace(\\\\,\\);
str1.replace(\{,{);
str1.replace(} \,});


解决方案

您的数据实际上是另一个JSON文档。



只需从doc1.object()[data]。toString();


创建另一个QJsonDocument。但它接缝清楚,数据可以有其他东西,这是一个json doc在这个例子中。



好运!


I'm getting some json data from a pusher.com WebSocket in my qt5 app and I'm struggling to parse the "serialized" json they send. I finally identified the problem but I'm not sure how to solve it:

I made a small test program to demonstrate:

QString str1 = "{\"event\":\"message\",\"data\":\"{\\\"channel\\\":\\\"trade.3\\\",\\\"trade\\\":{\\\"tradeid\\\":\\\"86364698\\\",\\\"timestamp\\\":1425420405,\\\"datetime\\\":\\\"2015-03-03 17:06:45 EDT\\\",\\\"marketid\\\":\\\"3\\\",\\\"marketname\\\":\\\"LTC\\\\/BTC\\\",\\\"quantity\\\":\\\"0.24680554\\\",\\\"price\\\":\\\"0.00694988\\\",\\\"total\\\":\\\"0.00171527\\\",\\\"type\\\":\\\"Buy\\\"}}\",\"channel\":\"trade.3\"}";

QString str2="{\"event\":\"message\",\"data\": {\"channel\":\"trade.3\",\"trade\":{\"tradeid\":\"86364698\",\"timestamp\":1425420405,\"datetime\":\"2015-03-03 17:06:45 EDT\",\"marketid\":\"3\",\"marketname\":\"LTC\\/BTC\",\"quantity\":\"0.24680554\",\"price\":\"0.00694988\",\"total\":\"0.00171527\",\"type\":\"Buy\"}},\"channel\":\"trade.3\"}";

QJsonDocument doc1 = QJsonDocument::fromJson(str1.toUtf8());
QJsonDocument doc2 = QJsonDocument::fromJson(str2.toUtf8());

qDebug("%s", qPrintable(QString("Str1: \"%1\"").arg(str1)));
qDebug("%s", qPrintable(QString(doc1.toJson())));
qDebug() << "-----------------------------------------------------------";
qDebug("%s", qPrintable(QString("Str2: \"%1\"").arg(str2)));
qDebug("%s", qPrintable(QString(doc2.toJson())));

This outputs:

Str1: "{"event":"message","data":"{\"channel\":\"trade.3\",\"trade\":{\"tradeid\":\"86364698\",\"timestamp\":1425420405,\"datetime\":\"2015-03-03 17:06:45 EDT\",\"marketid\":\"3\",\"marketname\":\"LTC\\/BTC\",\"quantity\":\"0.24680554\",\"price\":\"0.00694988\",\"total\":\"0.00171527\",\"type\":\"Buy\"}}","channel":"trade.3"}"
{
    "channel": "trade.3",
    "data": "{\"channel\":\"trade.3\",\"trade\":{\"tradeid\":\"86364698\",\"timestamp\":1425420405,\"datetime\":\"2015-03-03 17:06:45 EDT\",\"marketid\":\"3\",\"marketname\":\"LTC\\/BTC\",\"quantity\":\"0.24680554\",\"price\":\"0.00694988\",\"total\":\"0.00171527\",\"type\":\"Buy\"}}",
    "event": "message"
}

-----------------------------------------------------------
Str2: "{"event":"message","data": {"channel":"trade.3","trade": {"tradeid":"86364698","timestamp":1425420405,"datetime":"2015-03-03 17:06:45 EDT","marketid":"3","marketname":"LTC\/BTC","quantity":"0.24680554","price":"0.00694988","total":"0.00171527","type":"Buy"}},"channel":"trade.3"}"
{
    "channel": "trade.3",
    "data": {
        "channel": "trade.3",
        "trade": {
            "datetime": "2015-03-03 17:06:45 EDT",
            "marketid": "3",
            "marketname": "LTC/BTC",
            "price": "0.00694988",
            "quantity": "0.24680554",
            "timestamp": 1425420405,
            "total": "0.00171527",
            "tradeid": "86364698",
            "type": "Buy"
        }
    },
    "event": "message"
}

Obviously the second version is my goal. Is there a way to easily convert the input data or am I going to have to try and roll my own converter function?

EDIT: The following does the trick on this particular data sample... but I'm still thinking there must be a more proper way to convert this sort of stuff...

str1.replace("\\\"", "\"");
str1.replace("\\\\", "\\");
str1.replace("\"{", "{");
str1.replace("}\"", "}");

解决方案

Your "data" is in fact another JSON document.

Just create another QJsonDocument from doc1.object()["data"].toString();

But it seams clear that "data" can have other things, it is a json doc in this example.

Good Luck!

这篇关于如何解析pusher.com的“序列化” json into qt5 QJsonDocument?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆