您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C++中对JSON格式的解析以及序列化和反序列化

时间:2023-05-22 14:36:27  来源:今日头条  作者:山城科技峰

前言

JSON是很常用的数据格式,在C++中我们可以使用nlohmann json做序列化和反序列化。
nlohmann json是一个跨平台的开源的C++ JSON解析库,只需要在项目中#include "json.hpp"文件就可以使用了。
Github上面的文档非常详细,你也可以通过本文对nlohmann json有个基本了解,本文涵盖了日常编码中会用json库处理的大部分操作,如构造json对象、查找键值、序列化与反序列。
github地址: https://github.com/nlohmann/json#serialization--deserialization

 

nlohmann json基础操作

 

由basic value创建json value

 using nlohmann::json;
 //方式一:
 json j1;
 j["name"]="LeBorn Jame";//字符串
 j["number"]=23;//整数
 j["man"]=true;//布尔值
 j["children"]={"LeBorn Jr","Bryce Maximus","Zhuri"};//数组
 j["behavior"]["funny"]="gigigigigigi";//对象中元素值
 j["wife"]={{"name","Savannah Brinson"},{"man",false}};//对象
 
 //方式二
 json j2={
 {"name","LeBorn Jame"},
 {"number",23},
  {"man",true},
 {"children",{"LeBorn Jr","Bryce Maximus","Zhuri"}},
 {"behavior",{{"funny","gigigigigigi"}};
 {"wife",{{"name","Savannah Brinson"},{"man",false}}}
 };

由json value得到basic value

 using nlohmann::json;
 json j={
 {"name","LeBorn Jame"},
 {"number",23},
 {"children",{"LeBorn Jr","Bryce Maximus","Zhuri"}},
 {"man",true},
 {"wife",{"name","Savannah Brinson"}}
 };
 auto name=j["name"].get<std::string>();//方式一
 int number=0;
 j["number"].get_to(number);//方式二
 auto childOne = j["children"][0].get<std::string>();//获取数组元素方式一,越界后不会抛出异常,直接中断
 auto childTwo=j["children"].at(1).get<std::string>();//越界后抛出异常
 auto wifeName=j["wife"]["name"].get<std::string>();
 
//bool man=j["man"];//不推荐使用这种隐式转换的方式

像操作stl container一样操作json value

using nlohmann::json;
json animalArray={"cat","dog"};//定义一个数组类型的json对象
animalArray.push_back("pig");//添加元素
animalArray.emplace_back("duck");//C++11新方式添加元素,减少申请内存
//使用is_array()函数判断对象类型,使用empty函数判断数量是否为空
if(animalArray.is_array() && !animalArray.empty())
{
    auto size=animalArray.size();//使用size函数获取元素数量
    auto animalLast=animalArray.at([size-1]).get<std::string>();
}

json animalObject={{"kind","dog"},{"height",50}};//定义一个对象类型的json对象
animalObject.emplace({"color","red"});//插入元素
animalObject.erase("kind");//删除键值

//判断是否含有某个键值方式一
if(animalObject.contains("height"))//通过contains函数判断是否包含某个key
{
    auto height=animalObject["height"].get<double>();
}
//判断是否含有某个键值方式二
auto size=animalObject.count("height");//通过count函数计算某一个键的数量
if(size>0)
{
    
}
//判断是否含有某个键值方式三
auto iter=animalObject.find("height");//通过find函数查找某个键的迭代器
if(iter!=animalObject.end()
{
    
}
//遍历输出键值方式一
for(auto item:animalObject.items())
{
    std::cout<<item.key()<<" "<<item.value()<<std::endl;
}
//遍历输出键值方式2
for(auto iter=animalObject.begin();iter!=animalObject.end();++iter)
{
    std::cout<<iter->key()<<" "<<iter->value()<<std::endl;
}
//遍历输出键值方式3(C++17)
for(auto[key,value]:animalObject.keys())
{
    std::cout<<key<<" "<<value<<std::endl;
}

序列化与反序列化(Serialization/Deserialization)

json value和string

using nlohmann::json;
//反序列化(Deserialization):_json/parse()
json j1="{"kind":"dog","height":50}"_json;//方式一,通过"_json"实现
json j2=R"({"kind":"dog","height":50})";//使用原生字符串关键字R来避免转移字符,但这一句并没有序列化,j2只保存字符串而已
json j3=json::parse(R"({"kind":"dog","height":50})");//方式二,通过静态函数"parse"实现。
//使用 parse 函数时,如果字符串不符合 json 规范导致解析失败,默认会抛出异常,可以使用 try...catch 结构捕获异常进行处理;或者设置 parse 函数的第三个函数参数为 false,此时解析失败不会抛出异常,但解析得到的结果为 null。

//序列化(Serialization):dump(number),number为打印出的空格数
std::string animal1=j1.dump();//animal1值为{"kind":"dog","height":50}
std::string animal2=j1.dump(4);
//animal2值为
// {
//      "kind":"dog",
//      "height":50,
// }

json value和streams

using nlohmann::json;
//反序列化(Deserialization):>>
json j1;
std::cin>>j1;

//序列化(Seriralization):<<
std::cout<<j1;

//上述操作适用于istream和ostream的子类,比如我们经常会用到的ifstream和ofstream
std::ifstream in(animals.json);//打开文件,关联到流in
json animals;
in>>animals;
animals.at(0)["height"]=60;//修改数据
in.close();

std::ofstream out(animal.json);//打开文件,关联到流out
out<<std::setw(4)<<animals;//输出信息,std::setw(4)用于设置增加打印空格
out.close();

json value和自定义对象

在自定义对象命名空间中定义两个函数即可像basic value一样进行反序列化和序列化:from_json(const json& j,T& value)、to_json(json& j,const T& value)

//Animal.h文件
//定义Animal类,其包含两个成员变量kind与height
using nlohmann::json;
class Animal
{
    public:
        Animal(std::string kind,double height){
            this->kind=kind;
            this->height=height;
        }
    std::string kind;
    double height;
}
//定义from_json(const json& j,T& value)函数,用于序列化
void from_json(const json& j,Animal& animal)
{
    animal.kind=j["kind"].get<std::string>();
    animal.height=j["height"].get<double>();
}

//定义to_json(json& j,const T& value)函数,用于反序列化
void to_json(json& j,const Animal& animal)
{
    j["kind"]=animal.kind;
    j["height"]=animal.height;
}

//main.cpp文件
int main()
{
    Animal animal{"dog",50};
    nlohmnn::json j=animal;//像basic value一样将自定义对象赋值给json value
    j["height"]=60;//修改数据
    Animal animalNew = j.get<Animal>();//像basic value一样通过get函数获取值,将其值直接赋值给自定义对象
    std::cout<<animal.height;//输出60
    return 0;
}


Tags:C++   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
前言JSON是很常用的数据格式,在C++中我们可以使用nlohmann json做序列化和反序列化。 nlohmann json是一个跨平台的开源的C++ JSON解析库,只需要在项目中#include "json.hpp"...【详细内容】
2023-05-22  Tags: C++  点击:(0)  评论:(0)  加入收藏
取代C++!微软正在改用Rust语言重写Win11内核微软已经确定结束对Win10进行功能更新,其更多精力将转移到Win11以及“Win12”上。在日前举办的BlueHat IL 2023 大会上,微软企业和...【详细内容】
2023-04-29  Tags: C++  点击:(34)  评论:(0)  加入收藏
C++自适应函数符和函数适配器是C++标准库中非常重要的概念,它们为C++程序员提供了更加灵活和高效的编程方式。自适应函数符是指一类函数对象,可以根据输入的参数类型自动推导...【详细内容】
2023-04-14  Tags: C++  点击:(30)  评论:(0)  加入收藏
C++11 中新增了一种智能指针类型 unique_ptr,它是一种独占式的智能指针,用于管理动态分配的对象,并确保在其生命周期结束时正确释放资源。在使用 unique_ptr 时,指针指向的资源...【详细内容】
2023-04-08  Tags: C++  点击:(35)  评论:(0)  加入收藏
第一、四个用途用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符...【详细内容】
2023-04-03  Tags: C++  点击:(33)  评论:(0)  加入收藏
作 者 | 吴强强(去鸿)作者最近尝试写了一些Rust代码,本文主要讲述了对Rust的看法和Rust与C++的一些区别。背景S2在推进团队代码规范时,先后学习了盘古编程规范,CPP core guide...【详细内容】
2023-03-31  Tags: C++  点击:(28)  评论:(0)  加入收藏
C++、C和汇编语言是计算机编程中常见的三种编程语言。它们之间有很多相似之处,也有很多不同之处。首先,C++和C都是高级语言,而汇编语言是低级语言。高级语言是一种人类易于理解...【详细内容】
2023-03-29  Tags: C++  点击:(28)  评论:(0)  加入收藏
【CSDN 编者按】开发者 Nikita Lapkov :从 C++ 切换到 Rust 后,日常工作体验得到了极大地提升。原文链接:https://laplab.me/posts/switching-from-cpp-to-rust/作者 | Nikita...【详细内容】
2023-03-28  Tags: C++  点击:(39)  评论:(0)  加入收藏
双减后,数竞赛道受限,信竞赛道涌入不少青少年身影。然而,想要参加信息学奥赛,就得学会使用程序语言,目前国内信息学奥赛的指定语言是C++,若要在小初阶段冲刺竞赛高分,不少人首选编...【详细内容】
2023-03-23  Tags: C++  点击:(76)  评论:(0)  加入收藏
作者:leomryang,腾讯 PCG 后台开发工程师 HashTable是开发中常用的数据结构。本文从C++ STL中的HashTable讲起,分析其存在的性能问题,对比业界改进的实现方式。通过基准测试对比...【详细内容】
2023-03-22  Tags: C++  点击:(46)  评论:(0)  加入收藏
▌简易百科推荐
前言JSON是很常用的数据格式,在C++中我们可以使用nlohmann json做序列化和反序列化。 nlohmann json是一个跨平台的开源的C++ JSON解析库,只需要在项目中#include "json.hpp"...【详细内容】
2023-05-22  山城科技峰  今日头条  Tags:C++   点击:(0)  评论:(0)  加入收藏
CefSharp是一个基于Chromium的开源.NET库,可以在C#应用程序中嵌入Web浏览器。以下是使用CefSharp内嵌网页的步骤: 1. 安装CefSharp NuGet包:在Visual Studio中打开NuGet包管理...【详细内容】
2023-05-22  opendotnet  今日头条  Tags:C#   点击:(2)  评论:(0)  加入收藏
前言本文是关于如何创建Rest API C#控制台应用程序的,在此之前,我们必须知道什么是RESTful api。RESTful API是一种应用程序接口(API),它使用HTTP方法请求GET、PUT、POST和DELETE...【详细内容】
2023-05-20  山城科技峰  今日头条  Tags:C#   点击:(0)  评论:(0)  加入收藏
当我第一次开始使用 DOS 时,我喜欢 DOS 自带的 BASIC 来编写游戏和其它一些有趣的程序。很长时间后,我才学习 C 编程语言。我马上爱上了使用 C 语言做开发!它是一种简单易懂的...【详细内容】
2023-04-21    Linux中国  Tags: C 语言   点击:(49)  评论:(0)  加入收藏
C++自适应函数符和函数适配器是C++标准库中非常重要的概念,它们为C++程序员提供了更加灵活和高效的编程方式。自适应函数符是指一类函数对象,可以根据输入的参数类型自动推导...【详细内容】
2023-04-14  睿智的海边风浪  今日头条  Tags:C++   点击:(30)  评论:(0)  加入收藏
C++11 中新增了一种智能指针类型 unique_ptr,它是一种独占式的智能指针,用于管理动态分配的对象,并确保在其生命周期结束时正确释放资源。在使用 unique_ptr 时,指针指向的资源...【详细内容】
2023-04-08  睿智的海边风浪  今日头条  Tags:C++   点击:(35)  评论:(0)  加入收藏
第一、四个用途用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符...【详细内容】
2023-04-03  QT教程    Tags:C   点击:(33)  评论:(0)  加入收藏
众所周知,C++ 中的string使用比较方便。关于C++ 中的string源码实现最近工作中使用C语言,但又苦于没有高效的字符串实现,字符串的拼接和裁剪都比较麻烦,而且每个字符串都需要申...【详细内容】
2023-04-02  Chadwik  今日头条  Tags:C语言   点击:(31)  评论:(0)  加入收藏
C#的应用也比较多,有时候,我们想要研究一下别人的优秀的项目,可能会借助一些非常规手段来学习。下面,我就分享几款开源的C#反编译工具。dnSpydnSpy 是一个用C#开发,开源的调试器...【详细内容】
2023-03-30  自学编程之道  今日头条  Tags:C#   点击:(77)  评论:(0)  加入收藏
定义与基本操作一级指针(或简称指针)是一个存储了一个内存地址的变量。这个变量的值可以是任何一个内存地址。指针变量可以指向任何类型的数据,包括整数、字符、字符串和结构体...【详细内容】
2023-03-23  千里马的驴  今日头条  Tags:C语言   点击:(40)  评论:(0)  加入收藏
站内最新
站内热门
站内头条