zoukankan      html  css  js  c++  java
  • Qml之Json序列化与反序列化

    Json

    {
        "data": [
            {
                "addr""testAddr1",
                "name""testName1",
                "symbol""testSymbol1"
            },
            {
                "addr""测试测试",
                "name""测试无BUG",
                "symbol""测试通过"
            },
            {
                "addr""nice",
                "name""今天不送测",
                "symbol""有需求明年再说"
            },
            {
                "addr""happy",
                "name""今晚上线",
                "symbol""version meeting"
            }
        ]
    }

    解析后

    qml: addr: testAddr1 name: testName1 symbol: testSymbol1

    qml: addr: 测试测试 name: 测试无BUG symbol: 测试通过

    qml: addr: nice name: 今天不送测 symbol: 有需求明年再说

    qml: addr: happy name: 今晚上线 symbol: version meeting

    qml可以绘制界面,展示视图信息。在大数据、批量数据的情况下,信号与槽机制就显得不太灵活了。

    就可以Json作为一种通信方式,完成数据的交互与储存。

    在视图模型中:ListView、TableView等。运用较为广泛,qml却没有现成的JSON库提供序列化和反序列的操作。

    此文档,就是提供出一个思路:在QML中如何构造Json,如何解析Json。

    必备:

    1、需要明白Json的组成元素和规则。(请自行百度)

    2、需要明白从Json到string字符串添加了什么东西?两者的区别是什么?

    3、QML中提供的JSON的解析规则是怎样的?

    比如:

    {

    "data": {

    "data1":"test1",

    "data2":"test2"

    }

    }

    将上述的Json序列化到stringData

    解析方式一:全解析

    var jsonData=JSON.parse(stringData);

    使用:

    var data=jsonData.data;

    var data1=jsonData.data.data1

    var data2=jsonData.data.data2

    解析方式二:部分解析

    var jsonData=JSON.parse(stringData).data;

    使用:

    var data1=jsonData.data1

    var data2=jsonData.data2

    解析方式三:具体解析

    var data1=JSON.parse(stringData).data.data1;

    var data2=JSON.parse(stringData).data.data2;

    区别:

    1、qml提供出解析层级。即可以解析到某一个字段,并拿到里面的数据。

    2、解析方式。qml的解析方式、字段读取,都是使用"."。对比其他Json库,----jsonData["data"]、jsonData["data"]["data1"]。

    3、安全性。qml的Json解析是弱解析。意味着即使Json格式出错了、字段不存在等情况都不会崩溃,仅是警告处理。因此需要确保Json的正确性。

    下面给出一个简单的ListView作为参考Demo

        function jsonToString(model) {
            var res = "{ "data": [ ";
            console.log("count: " + model.count);
            for(var i = 0; i < model.count; ++i) {
                res += " { ";
                var e = model.get(i);
                res += ""addr": ""   + e.addr + "", ";
                res += ""name": "" + e.name + "", ";
                res += ""symbol": "" + e.symbol +"" ";
     
                // The last one should not have the ending ","
                if ( i === model.count -1)
                    res += " }";
                else
                    res += " },";
            }
            res += " ]}";
            console.log("res: " + res );
            return res;
        }
     
        function stringToJson(stringData){
            console.log("req stringData:",stringData);
            var jsonData=JSON.parse(stringData).data;
            //for(var i=0;i<jsonData.length;++i){
            //    console.log("addr:",jsonData[i].addr,
            //                " name:",jsonData[i].name,
            //                " symbol:",jsonData[i].symbol);
            //}
            return jsonData;
        }
     
        ListModel {
            id: listModel
            ListElement {
                addr:"testAddr1"
                name:"testName1"
                symbol:"testSymbol1"
            }
            ListElement {
                addr:"测试测试"
                name:"测试无BUG"
                symbol:"测试通过"
            }
            ListElement {
                addr:"nice"
                name:"今天不送测"
                symbol:"有需求明年再说"
            }
            ListElement {
                addr:"happy"
                name:"今晚上线"
                symbol:"version meeting"
            }
        }
     
        ListView{
            id: listview
            256
            height: 180
            x:100
            y:100
            model: listModel
            //delegate: listDelegate
        }
     
     
    //---------------------------------------------------------------------------------------------------------
    //test
            Rectangle{
                x:50
                y:50
                200
                height:30
                border. 1
                Text {
                    text: qsTr("序列化")
                    anchors.centerIn: parent
                }
                MouseArea{
                    anchors.fill: parent
                    onClicked: {
                        var data=jsonToString(listModel)
                        console.log(data);
                    }
                }
            }
     
            Rectangle{
                x:300
                y:50
                200
                height:30
                border. 1
                Text {
                    text: qsTr("反序列化")
                    anchors.centerIn: parent
                }
                MouseArea{
                    anchors.fill: parent
                    onClicked: {
                        var data=jsonToString(listModel)
                        var jsonData=stringToJson(data)
                        console.log(jsonData);
                        for(var i=0;i<jsonData.length;++i){
                            console.log("addr:",jsonData[i].addr,
                                        " name:",jsonData[i].name,
                                        " symbol:",jsonData[i].symbol);
                        }
                    }
                }
            }
    //test
  • 相关阅读:
    Mvc分页:为IQueryable定义一个扩展方法,直接反回PagedList<T>结果集
    从零开始一起学习SLAM | 相机成像模型
    从零开始一起学习SLAM | 为啥需要李群与李代数?
    从零开始一起学习SLAM | 三维空间刚体的旋转
    从零开始一起学习SLAM | 为什么要用齐次坐标?
    从零开始一起学习SLAM | C++新特性要不要学?
    从零开始一起学习SLAM | SLAM有什么用?
    从零开始一起学习SLAM | 学习SLAM到底需要学什么?
    2019年度【计算机视觉&机器学习&人工智能】国际重要会议汇总
    从零开始一起学习SLAM | 为什么要学SLAM?
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/15027879.html
Copyright © 2011-2022 走看看