文章目录
- 1.Json数据类型
- 基础数据类型
- 复合数据类型
- JSON数据类型的应用
- 2.学习jsoncpp库
- 利用json实现序列化
- 利用json实现反序列化
1.Json数据类型
json 是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。json数据交换格式是将多种数据对象组织成为⼀个字符串。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它支持多种数据类型,包括字符串、数字、布尔值、空值、对象和数组。
基础数据类型
JSON支持四种基础数据类型:字符串" "
(string)、数字(整形/浮点型)(number)、布尔型(boolean)和空值(null)。
字符串必须用双引号括起来,数字可以是整数或浮点数,布尔型表示为true或false,而空值则表示为null。
复合数据类型
JSON还支持两种复合数据类型:对象(object)和数组(array)。
对象是由花括号{}包围的键值对集合,其中键是字符串,值可以是任何JSON支持的数据类型。
数组是由方括号[]包围的值的有序列表,数组中的每个值可以是任何JSON支持的数据类型。
JSON数据类型的应用
在实际应用中,JSON数据类型广泛用于数据存储和交换。例如,在MySQL数据库中,从5.7版本开始支持JSON数据类型,允许直接在数据库中存储和操作JSON格式的数据。这种支持极大地增强了数据库处理非结构化数据的能力。
2.学习jsoncpp库
jsoncpp 库用于实现 json 格式的序列化和反序列化,完成将多个数据对象组织成为 json 格式字符串,以及将json 格式字符串解析得到多个数据对象的功能。
这其中主要借助三个类以及其对应的少量成员函数完成:
// Json数据对象类
// typedef unsigned int Json::ArrayIndex value.hclass Json::Value
{// Value重载了 [] 和 = 赋值/获取数据可以通过简单的⽅式完成Value &operator=(const Value &other);Value &operator[](const std::string &key); // val["姓名"] = "⼩明Value &operator[](const char *key);Value removeMember(const char *key); // 移除元素const Value &operator[](ArrayIndex index) const; // val["成绩"][0]Value &append(const Value &value); // 添加数组元素 val["成绩"].append(88);ArrayIndex size() const; // 获取数组元素个数 val["成绩"].size();std::string asString() const; // 转string val["name"].asString();const char *asCString() const; // 转char* val["name"].asCString();Int asInt() const; // 转 int val["age"].asInt();float asFloat() const; // 转 floatbool asBool() const; // 转 bool
};// json序列化类 低版本⽤
class JSON_API Writer
{virtual std::string write(const Value &root) = 0;
};
class JSON_API FastWriter : public Writer
{virtual std::string write(const Value &root);
};
class JSON_API StyledWriter : public Writer
{virtual std::string write(const Value &root);
};// json序列化类 ⾼版本推荐 ⽤低版本的接⼝可能会有警告
class JSON_API StreamWriter
{virtual int write(Value const &root, std::ostream *sout) = 0;
};
class JSON_API StreamWriterBuilder : public StreamWriter::Factory
{virtual StreamWriter *newStreamWriter() const;
};// json反序列化类 低版本⽤
class JSON_API Reader
{bool parse(const std::string &document, Value &root, bool collectComments = true);
};// json反序列化类 ⾼版本更推荐
class JSON_API CharReader
{virtual bool parse(char const *beginDoc, char const *endDoc, Value *root, std::string *errs) = 0;
};
class JSON_API CharReaderBuilder : public CharReader::Factory
{virtual CharReader *newCharReader() const;
}
利用json实现序列化
#include <iostream>
#include <sstream>
#include <string>
#include <memory>
#include <jsoncpp/json/json.h>
//g++ jsonSerialize.cc -o jsonSerialize -ljsoncpp -std=c++11
int main()
{//结构化数据 -- json数据 -- 字符串数据const char *name = "小明 ";int age = 18;float score[] = {77.5, 88, 93.6};//1.将所有的数据保存在Json::Value对象中Json::Value root;root["姓名"] = name;root["年龄"] = age;root["成绩"].append(score[0]);root["成绩"].append(score[1]);root["成绩"].append(score[2]);//2. 将json对象序列化成字符串Json::StreamWriterBuilder swb;std::unique_ptr<Json::StreamWriter> swPtr(swb.newStreamWriter());std::stringstream ss;swPtr->write(root, &ss);//json对象写到bufferstd::cout << ss.str() << std::endl;return 0;
}
利用json实现反序列化
#include <iostream>
#include <string>
#include <memory>
#include <jsoncpp/json/json.h>
//g++ jsonParse.cc -o jsonParse -l jsoncpp
// 将字符串反序列化为json对象
int main()
{// R: 表示之后皆为原始字符串//(const char [54]) "{\"姓名\":\"小黑\",\"年龄\":19,\"成绩\":[58.5,56,59]}"std::string str = R"({"姓名":"小黑","年龄":19,"成绩":[58.5,56,59]})";Json::Value root;Json::CharReaderBuilder crb;std::unique_ptr<Json::CharReader> crPtr(crb.newCharReader());//从strbuf读到json//bool parse(const char *beginDoc, const char *endDoc, Value *root, string *errs)std::string err;//从一个字符序列中解析存储在Value对象中 将错误信息存储在string类型的对象中bool parseOk = crPtr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);if (parseOk == false){std::cout << "parse error: " << err << std::endl;return -1;}std::cout << root["姓名"].asString() << std::endl;std::cout << root["年龄"].asInt() << std::endl;for (int i = 0; i < root["成绩"].size(); i++)std::cout << root["成绩"][i] << std::endl;return 0;
}