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
  • 相关阅读:
    hyper-v启动虚拟机时提示“The application encountered an error while attempting to change the state of the machine ‘虚拟机名称'”如何处理?
    ubuntu下如何开机自动执行自定义脚本?
    centos下如何开放某个端口?
    linux都有哪些运行级别?
    linux内核在挂载ramdisk的过程中报错"RAMDISK: incomplete write (10739 != 32768)"如何处理?
    linux内核挂载根文件系统时报错”VFS: Cannot open root device "ram0" or unknown-block(0,0): error -6“如何处理?
    c代码审查软件
    项目管理术语表
    项目管理常用缩写
    MYSQL的读写分离主从延时问题
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/15027879.html
Copyright © 2011-2022 走看看