JsonCpp Json对象写入

JsonCpp Json对象写入

概述

​ 有了上两篇的介绍,对于Json格式数据的解析在大多数场景下已经够用,不过Json数据的应用可不止于读取,还有大量的情况需要用到Json对象的写入,下面就来说一下Json对象的写入。

简单Json对象写入

​ 前面说到,对于简单的Json对象操作,Json::Value对象行为与std::map对象类似,可以使用”[]”通过Key值获取相应的Value值,同样,在写入时,行为也是类似的。若Json::Value对象中没有该Key,则会创建一个相应的Key,并赋予等号右边的值作为Value值。操作方法可以通过一段简单的代码来理解:

//
// main.cpp
// TestJson
//
// Created by Morris on 2016/11/21.
// copyright © 2016年 Morris. All rights reserved.
//

#include <iostream> 
#include <fstream>
#include <string>
#include <json/json.h>

int main(int argc,const char * argv[])
{
    std::ifstream ifs;
    ifs.open("/Users/Morris/Code/cpp/test/test.json");
    Json::Value val;
    Json::Value arr;
    Json::Reader reader;

    val["Name"] = Json::Value("Morris");
    val["Age"] = Json::Value(22);

    //解析为Json风格的字符串
    Json::StyledWriter sw;
    std::string res_str = sw.write(val);
    std::cout << res_str << std::endl;

    return 0;
}

Json数组对象写入

​ Json数组对象也可以参照上面提到的简单Json对象的写入,可以构造单纯的Json数组对象,即不属于任何Json对象的属性,操作方法是直接调用Json::Value的成员方法append,append可以直接向一个空的Json::Value对象中附加数组元素,具体操作与结果如下:

//
// main.cpp
// TestJson
//
// Created by Morris on 2016/11/21.
// copyright © 2016年 Morris. All rights reserved.
//

#include <iostream> 
#include <fstream>
#include <string>
#include <json/json.h>

int main(int argc,const char * argv[])
{
    std::ifstream ifs;
    ifs.open("/Users/Morris/Code/cpp/test/test.json");
    Json::Value val;
    Json::Value arr;
    Json::Reader reader;

    val["Name"] = Json::Value("Morris");
    val["Age"] = Json::Value(22);
    for (int i = 0; i < 3; ++i) {
        arr.append(Json::Value(val));
    }

    //解析为Json风格的字符串
    Json::StyledWriter sw;
    std::string res_str = sw.write(arr);
    std::cout << res_str << std::endl;

    return 0;
}

Res:

[

{

“Age” : 22,

“Name” : “Morris”

},

{

“Age” : 22,

“Name” : “Morris”

}

]

​ 也可以构造属于某一Json对象的属性的Json数组对象,两者操作上的差别也仅在append调用时,仔细看示例代码即可,具体代码与相应结果如下:

//
// main.cpp
// TestJson
//
// Created by Morris on 2016/11/21.
// copyright © 2016年 Morris. All rights reserved.
//

#include <iostream> 
#include <fstream>
#include <string>
#include <json/json.h>

int main(int argc,const char * argv[])
{
    std::ifstream ifs;
    ifs.open("/Users/Morris/Code/cpp/test/test.json");
    Json::Value val;
    Json::Value arr;
    Json::Reader reader;

    val["Name"] = Json::Value("Morris");
    val["Age"] = Json::Value(22);
    for (int i = 0; i < 3; ++i) {
        arr["Person"].append(Json::Value(val));
    }

    //解析为Json风格的字符串
    Json::StyledWriter sw;
    std::string res_str = sw.write(arr);
    std::cout << res_str << std::endl;

    return 0;
}

Res:

{

“Person” : [

{

“Age” : 22,

“Name” : “Morris”

},

{

“Age” : 22,

“Name” : “Morris”

}

]

}

​ 在append调用时,val首先先调用了Json::Value的”[]”操作符重载,由上述所说,若val没有这个Key,则会创建一个,之后再调用append,则将数组元素添加到了相应的Key下的数组中。

构造Json格式的空数组

​ 有时也会需要构造一个符合Json格式的空数组,这时候如果继续用append,则结果将与我们所需要的不一致,它会出现这样的情况: [ null ]。对于这个问题的解决,可以使用Json::Value的resize方法,使用resize(0)则可以构造一个符合我们需求的Json空数组,具体操作与结果如下:

//
// main.cpp
// TestJson
//
// Created by Morris on 2016/11/21.
// copyright © 2016年 Morris. All rights reserved.
//

#include <iostream> 
#include <fstream>
#include <string>
#include <json/json.h>

int main(int argc,const char * argv[])
{
    std::ifstream ifs;
    ifs.open("/Users/Morris/Code/cpp/test/test.json");
    Json::Value val;
    Json::Value arr;
    Json::Reader reader;

    arr["Person"].resize(0);

    //解析为Json风格的字符串
    Json::StyledWriter sw;
    std::string res_str = sw.write(arr);
    std::cout << res_str << std::endl;

    return 0;
}

Res:

{

“Person” : []

}

相关文章

AJAX是一种基于JavaScript和XML的技术,能够使网页实现异步交...
在网页开发中,我们常常需要通过Ajax从后端获取数据并在页面...
在前端开发中,经常需要循环JSON对象数组进行数据操作。使用...
AJAX(Asynchronous JavaScript and XML)是一种用于创建 We...
AJAX技术被广泛应用于现代Web开发,它可以在无需重新加载页面...
Ajax是一种通过JavaScript和HTTP请求交互的技术,可以实现无...