【云备份】学习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.h

class 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;                           // 转 float
    bool 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对象写到buffer
    std::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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿猿收手吧!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值