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\": [\n";
        console.log("count: " + model.count);
        for(var i = 0; i < model.count; ++i) {
            res += "\n{\t";
            var e = model.get(i);
            res += "\"addr\": \""   + e.addr + "\",\n\t";
            res += "\"name\": \"" + e.name + "\",\n\t";
            res += "\"symbol\": \"" + e.symbol +"\"\n\t";
 
            // The last one should not have the ending ","
            if ( i === model.count -1)
                res += "\n}";
            else
                res += "\n},";
        }
        res += "\n]}";
        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
        width:256
        height: 180
        x:100
        y:100
        model: listModel
        //delegate: listDelegate
    }
 
 
//---------------------------------------------------------------------------------------------------------
//test
        Rectangle{
            x:50
            y:50
            width:200
            height:30
            border.width: 1
            Text {
                text: qsTr("序列化")
                anchors.centerIn: parent
            }
            MouseArea{
                anchors.fill: parent
                onClicked: {
                    var data=jsonToString(listModel)
                    console.log(data);
                }
            }
        }
 
        Rectangle{
            x:300
            y:50
            width:200
            height:30
            border.width: 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

 

posted @ 2021-07-18 21:51  gd_沐辰  阅读(1544)  评论(0编辑  收藏  举报