利用QScript解析json

**

利用QScript解析json

**

由于QT4缺少QJson模块,无法使用QJson的方式便捷的解析json字符串,本文在此提供另一种方式进行解析,应该可以解决80%~90%的问题。环境是Linux下的QT4.8,由简到难,提供三段代码供大家参考。

首先pro文件包含

QT     +=  script

包含头文件

#include <QScriptEngine>
#include <QScriptValueIterator>

情况一:

    QString strJson = "{\"department\":\"computer science\", \"person number\":\"45\", \"student\":[{\"Name\":\"ccf\",\"Math\":\"95\", \"Chinese\":\"84\"}, {\"Name\":\"zhangsan\",\"Math\":\"75\", \"Chinese\":\"70\"}]}";
    QScriptEngine engine;
    QScriptValue sc =  engine.evaluate("value=" + strJson);
    qDebug() << "department:" << sc.property("department").toString() << "person number:" << sc.property("person number").toString() << sc.property("student").toString();//解析字段
    if (sc.property("student").isArray())   //解析数组
    {
        QScriptValueIterator it(sc.property("student"));
        while(it.hasNext())
        {
            it.next();
            if (!it.value().property("Name").toString().isEmpty())
            {
                qDebug() << "Name :" << it.value().property("Name").toString();
                qDebug() << "Math :" << it.value().property("Math").toString();
                qDebug() << "Chinese :" << it.value().property("Chinese").toString();
            }
        }
    }

情况二

    QString strJson = "{\"department\":\"computerScience\",\"student\":[{\"Name\":\"zhangsan\",\"semester\":[{\"schoolYear\":\"1\",\"Math\":\"95\",\"Chinese\":\"84\"},{\"schoolYear\":\"2\",\"Math\":\"96\",\"Chinese\":\"85\"}]},{\"Name\":\"zhangliu\",\"semester\":[{\"schoolYear\":\"1\",\"Math\":\"85\",\"Chinese\":\"74\"},{\"schoolYear\":\"2\",\"Math\":\"86\",\"Chinese\":\"75\"}]}]}";
    QScriptEngine engine;
    QScriptValue sc =  engine.evaluate("value=" + strJson);
    qDebug() << "department:" << sc.property("department").toString();//解析字段
    if (sc.property("student").isArray())   //解析数组
    {
        QScriptValueIterator it(sc.property("student"));
        while(it.hasNext())
        {
            it.next();
            if (!it.value().property("Name").toString().isEmpty())
            {
                qDebug() << "Name :" << it.value().property("Name").toString();
                if(it.value().property("semester").isArray())
                {
                    QScriptValueIterator it1(it.value().property("semester"));
                    while(it1.hasNext())
                    {
                        it1.next();
                        if (!it1.value().property("schoolYear").toString().isEmpty())
                        {
                            qDebug() << "schoolYear :" << it1.value().property("schoolYear").toString();
                            qDebug() << "Math :" << it1.value().property("Math").toString();
                            qDebug() << "Chinese :" << it1.value().property("Chinese").toString();
                        }
                    }
                }
            }
        }
    }

情况三

    QString strJson = "{\"Name\":\"Root\",\"AlarmInfos\":[{\"Name\":\"测试报警1\",\"ChooseIndex\":1,\"Conditions\":[{\"Values\":[1.0,2.0,3.0,4.0]},{\"Values\":[4.0,3.0,2.0,1.0]}]},{\"Name\":\"测试报警2\",\"ChooseIndex\":2,\"Conditions\":[{\"Values\":[7.0,7.0,8.0,8.0]},{\"Values\":[9.5,9.6,10.5,10.5]},{\"Values\":[11.6,11.6,12.6,11.6]}]}]}";
    QScriptEngine engine;
    QScriptValue sc =  engine.evaluate("value=" + strJson);
    qDebug() << "Name:" << sc.property("Name").toString();//解析字段
    if (sc.property("AlarmInfos").isArray())   //解析数组
    {
        QScriptValueIterator it(sc.property("AlarmInfos"));
        while(it.hasNext())
        {
            it.next();
            if (!it.value().property("Name").toString().isEmpty())
            {
                qDebug() << "Name :" << it.value().property("Name").toString();
                qDebug() << "ChooseIndex :" << it.value().property("ChooseIndex").toInt32();
                if(it.value().property("Conditions").isArray())
                {
                    QScriptValueIterator it1(it.value().property("Conditions"));
                    int count = 0;
                    while(it1.hasNext())
                    {
                        it1.next();
//                        if (it1.flags() & QScriptValue::SkipInEnumeration)
//                            continue;//由于发现在遍历的时候多循环了一次,使用这个可以过滤掉这一次
                        if(it1.value().property("Values").isArray())
                        {
                            ++count;
                            QScriptValue subsc1= it1.value().property("Values");//取数组
                            int count1 = 0;
                            while(subsc1.property(count1).isValid())//由于提供的数组不是 名字:值 这种格式,所以得通过索引的方式一一解析,isValid()可以将数组的有限项一一解析出来
                            {
                                qDebug() << "Conditions:" << count << "count1:" << count1 << "value" << QString::number(subsc1.property(count1).toVariant().toDouble());
                                count1++;
                            }
                        }
                    }
                }
            }
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值