例子
- 数据
jsondata={"cmd":"meetingmemberlist","memberinfos":[{"name":"李","number":"668162","status":"Offline"},{"name":"66668888","status":"Offline"},{"name":"1.221","number":"1234561","status":"Offline"},{"name":"1.42","status":"Offline"}],"session":"2989479764ll","touid":"19","xns":"18"}
- 解析(可以直接通过对象来获取 json):
void CEMViewMenuInteraction::get_memberdata_from_jsondate(std::string jsondata)
{
QByteArray ByteArr = QByteArray(jsondata.c_str());
//判断字符串转化为 QJsonDocument 是否出现了错误
QJsonParseError jsonError;//Qt5新类
QJsonDocument jsonDoc = QJsonDocument::fromJson(ByteArr, &jsonError);//Qt5新类
if (jsonError.error == QJsonParseError::NoError)
{
// qDebug()<< "parse jsondata";
if (jsonDoc.isObject())
{
QJsonObject rootObj = jsonDoc.object();
QString cmd;
QString session;
//是否含有key cmd
if (rootObj.contains("cmd"))
{
//取出key为rootpath的值
QJsonValue value = rootObj.value("cmd");
//判断是否是string类型
if (value.isString())
{
cmd = value.toString();
// qDebug()<< "cmd=" <<cmd;
}
}
if (rootObj.contains("session"))
{
//取出key为 session 的值
QJsonValue value = rootObj.value("session");
//判断是否是string类型
if (value.isString())
{
session = value.toString();
// qDebug()<< "session=" << session;
}
}
if (rootObj.contains("memberinfos"))
{
QJsonValue valueArray = rootObj.value("memberinfos");
//判断类型是否为array,并且将array遍历出来
if (valueArray.isArray())
{
QJsonArray jsonArray = valueArray.toArray();
QString child_name = "null";
QString child_status = "null";
for (int i = 0; i < jsonArray.count();i++)
{
QJsonValue childValue = jsonArray[i];
if (childValue.isObject())
{
QJsonObject childObject = childValue.toObject();
if (childObject.contains("name"))
{
QJsonValue valueJson = childObject.value("name");
if (valueJson.isString())
{
child_name = valueJson.toString();
// qDebug()<< "name=" <<child_name;
}
}
if (childObject.contains("status"))
{
QJsonValue valueJson = childObject.value("status");
if (valueJson.isString())
{
child_status = valueJson.toString();
// qDebug()<< "status=" <<child_status;
}
}
m_MemberListMap[child_name] = child_status;
}
}
}
}
}
}
}
以上代码来自于网络。
- 也可以用此方法(用jsonDoucment.toVariant()转了一次、和最后的toMap()、可以解析带[{…}]的数据)。第一种方法性能好一点
if(jsonData.contains("Complex") == true)
{
QJsonParseError jsonError;
QJsonDocument jsonDoucment = QJsonDocument::fromJson(jsonData, &jsonError);
if(jsonError.error == QJsonParseError::NoError)
{
if(!(jsonDoucment.isNull()||jsonDoucment.isEmpty()))
{
QVariantList dataList=jsonDoucment.toVariant().toList();
QString ip_psinout;
foreach (QVariant data, dataList)
{
QVariantMap Complex_dataMap = data.toMap();
ip_psinout = QString("%1,%2 %3").arg(ipaddress)
.arg(Complex_dataMap.value("ps").toString())
.arg(Complex_dataMap.value("InOut").toString());
rec_map.insert(ip_psinout,Complex_dataMap);//链表list.at()返回的const常量不能使用成员函数,得用[]
}
}
else
{
//检查错误类型
qDebug()<<"jsonError:"<<jsonError.errorString();
}
}
}
- 最后:不管是哪种方法、解析json数据的时候只能一组([{…}]或者{…})一组的传进去解析,不能多个组一起去解析,多个组一起不识别,可以做一个解析预处理,把收到的json数据分成好几组循环遍历解析。如解析[{…}]时:
QString s=jsonData;
//2.数据解析
QString start ="[";
QString end ="]";
int a1=s.indexOf(start);
int a2=s.indexOf(end);
if(a1 == -1 || a2 == -1 || a1 > a2)
{
return ;
}
QString rec = s.mid(a1,a2-a1+1);//正规的数据
int post = rec.indexOf(start,1);//判断里面是否有中括号
if(post > -1)
{
return ;
}
qDebug()<<"rec"<<rec;
dojsondata(rec.toLatin1());//解析json数据
QString m_rec = s.mid(a2+1);//截取之后的
//递归
rawdata_recursion(m_rec.toLatin1());