目录
一、关于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"}
]
参考内容:
爱编程的大丙