Json与jsoncpp
目录
一、关于Json
1.数据类型
2.语法规则
二、写Json相关API
1.Json::Value类
2.append方法
3.toStyledString方法
三、读Json相关API
1.Json::Reader类
2.parse方法
3.类型判断方法
4.类型转换方法
5.getMemberNames方法
四、完整代码
一、关于Json
Json是一种轻量级的数据交换格式,用于在不同系统之间传输和存储数据。
1.数据类型
Json支持以下几种数据类型:
- 数字(Number):可以是整数或浮点数,不支持前导零。
- 字符串(String):必须用双引号包裹,可以包含转义字符(如\n、\t、\\等)。
- 布尔值(Boolean):只有两个值true和false。
- 对象(Object):以花括号"{}"包围,内部是键值对的集合,键(key)必须是字符串,用双引号括起来,值(value)可以是任何有效的Json数据类型。
- 数组(Array):以方括号"[]"包围,内部是值(value)的有序集合,可以是任何有效的Json数据类型。
- null:表示空值或不存在的值。
2.语法规则
- 在对象或数组中,数据项之间使用逗号分隔。
- 对象使用{}包围,数组使用[]包围。
- JSON中的键必须是字符串,并且要用双引号括起来。
- JSON中的字符串值必须由双引号编写。
Json格式示例:
{
"name": "John",
"age": 30,
"isStudent": false,
"hobbies": [
"reading",
"swimming"
],
"address": {
"city": "New York",
"zip": "10001"
},
"hasCar": true,
"favoriteColor": null
}
关于jsoncpp库:
使用jsoncpp库解析json格式的数据,只需要掌握三个类:
- Value类:将json支持的数据类型进行了包装,最终得到一个Value类型。
- FastWriter类:将Value对象中的数据序列化为字符串。
- Reader类:反序列化,将ison字符串解析成Value类型。
二、写Json相关API
1.Json::Value类
Json::Value();
默认构造函数,可创建Value对象,用于构建JSON结构。
2.append方法
void append(const Value& value);
用于将一个Value对象添加到当前Value对象中。
3.toStyledString方法
string toStyledString() const;
将调用该方法的Value对象转换为格式化后的JSON字符串,使生成的JSON字符串更易于阅读。
该方法返回一个string类型的字符串,表示格式化后的JSON内容。
三、读Json相关API
1.Json::Reader类
Json::Reader();
创建一个Reader对象,用于解析JSON数据。
2.parse方法
bool parse(std::istream& infile, Value& root);
从输入流infile中解析JSON数据,并将解析结果存储到root对象中。
3.类型判断方法
bool isInt() const;
bool isDouble() const;
bool isString() const;
bool isBool() const;
bool isArray() const;
bool isObject() const;
用于判断当前Value对象的类型,返回值为bool类型。
4.类型转换方法
int asInt() const;
double asDouble() const;
string asString() const;
bool asBool() const;
将当前Value对象转换为相应类型并返回。
5.getMemberNames方法
Value::Members getMemberNames() const;
用于获取Value对象的所有键名,返回值为Value::Members类型,是一个string类型的vector容器。
四、完整代码
#include<iostream>
#include<json/json.h>
#include<fstream>
using namespace std;
using namespace Json;
void writeJson() {
Value root;
root.append("luffy");
root.append(19);
root.append(false);
Value ary1;
ary1.append("ace");
ary1.append("sabo");
ary1.append(Value::null);
root.append(ary1);
Value obj1;
obj1["sex"] = "man";
//第一种写法:
Value obj2;
obj2["height"] = 180;
obj2["weight"] = 70.5;
Value ary2;
ary2.append("eat");
ary2.append("sleep");
obj1["advantage"] = ary2;
obj1["info"] = obj2;
//第二种写法:
//obj1["info"]["height"] = 180;
//obj1["info"]["weight"] = 70.5;
//obj1["advantage"][0u] = "eat";
//obj1["advantage"][1u] = "sleep";
root.append(obj1);
string json = root.toStyledString();
ofstream outfile("D://test.json");
if (!outfile) {
cerr << "error" << endl;
return;
}
outfile << json;
outfile.close();
}
void printValue(const Value& root) {
if (root.isInt()) {
cout << root.asInt();
}
else if (root.isDouble()) {
cout << root.asDouble();
}
else if (root.isString()) {
cout << root.asString();
}
else if (root.isBool()) {
cout << root.asBool();
}
}
void handle(const Value& root) {
if (root.isNull()) {
cout << "null";
}
else if (root.isArray()) {
cout << "[";
for (size_t i = 0; i < root.size(); i++) {
const Value& item = root[i];
if (item.isArray() || item.isObject()) {
handle(item);
}
else {
printValue(item);
}
if (i != root.size() - 1) {
cout << ", ";
}
}
cout << "]";
}
else if (root.isObject()) {
cout << "{";
Value::Members keys = root.getMemberNames();
for (size_t i = 0; i < keys.size(); i++) {
const Value& item = root[keys[i]];
std::cout << keys[i] << ": ";
if (item.isArray() || item.isObject()) {
handle(item);
}
else {
printValue(item);
}
if (i != keys.size() - 1) {
cout << ", ";
}
}
cout << "}";
}
}
void readJson() {
ifstream infile("D://test.json");
Reader rd;
Value root;
rd.parse(infile, root);
handle(root);
}
int main(void)
{
writeJson();
readJson();
return 0;
}
格式解析:
[
"luffy",
19,
false,
[ "ace", "sabo", null ],
{
"advantage" : [ "eat", "sleep" ],
"info" : {
"height" : 180,
"weight" : 70.5
},
"sex" : "man"
}
]
参考内容:
爱编程的大丙