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” : []
}