nlohmann json使用-程序员宅基地

技术标签: 技术分享  c++  json  

1.nlohmann json

github地址(上面的文档非常详细,你也可以通过本文档对nlohmann json有个基本了解,本文档涵盖了日常编码中会用json库处理的大部分操作,如构造json对象、查找键值、序列化与反序列)

2.nlohmann json基础操作

2.1 由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}}}
 };

2.2 由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"];//不推荐使用这种隐式转换的方式

2.3 像操作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;
}


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

3.1 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,
// }

3.2 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();

3.3 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;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39568245/article/details/115312690

智能推荐

Underactuated Robotics - 欠驱动机器人学(一)- 全驱动与欠驱动系统-程序员宅基地

文章浏览阅读1.3k次,点赞41次,收藏29次。根据牛顿的观点,机械系统的动力学是二阶的(其状态由位置向量 q(也称为配置向量)和速度向量以及(可能还有)时间给出。二阶控制动力系统的一般形式是:其中 u 是控制向量。定义 1.1 (欠驱动控制微分方程) 二阶控制微分方程描述如下:在状态和时间 t 中,如果所得到的映射是可射的:对于每一个,都存在一个能产生预期响应的,那么系统就是全驱动的。否则,就是欠驱动(状态在时间 t)。_欠驱动

MuJoCo 入门教程(一)_mujoco camera-程序员宅基地

文章浏览阅读774次,点赞21次,收藏17次。在 MuJoCo 仿真中输入自定义数字有三种方法。首先,可在 XML 中定义全局数字字段。它们有一个名称和一个实数值数组。其次,可以通过特定元素的自定义数组来扩展某些模型元素的定义。具体方法是在 XML 元素大小中设置 nuser_XXX 属性。第三,数组 mjData.userdata 不用于任何 MuJoCo 计算。用户可以在这里存储自定义计算的结果;请记住,所有随时间变化的内容都应存储在 mjData 中,而不是 mjModel 中。自定义文本字段可以保存在模型中。_mujoco camera

blender附带自动权重时的骨头加权问题_blender附带自动权重错误-程序员宅基地

文章浏览阅读749次。这是一个笨办法,而且需要在调整骨骼前确定,不然得放大后重新调整。先碎碎念一下好用的绑骨骼小功能(主要是我自己老是忘记)有时候ctrl+p附带自动权重后,会出现 “键放大模型和骨骼,一直放大直到绑定成功。✦把骨骼显示在人体前面,方便调整动作。有没有小伙伴有更好的方法 QAQ。(注:一定要在编辑模式下)_blender附带自动权重错误

大数据之数据治理架构 —— Atlas_atlas数据治理-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏9次。数据治理是一种组织和管理数据资源的过程,旨在确保数据的质量、安全性、可靠性、可访问性和合规性,以支持企业决策和运营需求。数据治理涉及制定和执行数据管理策略、规则和流程,包括数据分类、数据质量管理、数据安全和隐私保护、数据共享和访问控制、数据存储和备份等方面。数据治理通常需要跨部门合作,包括IT、业务和法务等部门,以确保数据资源在整个企业中的有效管理和利用。数据治理对于企业决策的准确性和效率至关重要,可以提高数据价值、减少风险和遵守法规要求。_atlas数据治理

大模型的开源&闭源_大模型开源和闭源区别-程序员宅基地

文章浏览阅读1.9k次,点赞21次,收藏24次。开源让技术共享,吸引了众多人才加入,推动了大模的创新。而闭源则保护了商业利益和技术优势,为大模型的商业应用提供了更好的保障。_大模型开源和闭源区别

区块链共识机制的演进_sbft共识-程序员宅基地

文章浏览阅读700次。分布式系统的基本概念FLP不可能原理和CAP原理FLP 不可能原理(FLP impossibility):在网络可靠,存在节点失效(即便只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性算法。1985年 FLP 原理实际上说明对于允许节点失效情况下,纯粹异步系统无法确保一致性在有限时间内完成。 科学告诉你什么是不可能的;工程则告诉你,付出一些代价,我可以把它变成可能。..._sbft共识

随便推点

uni-app实现问卷调查试卷_uview调查问卷-程序员宅基地

文章浏览阅读4.8k次,点赞2次,收藏20次。uni-app实现问卷调查试卷先向后台请求试卷内容,请求方法如下:data() { return { sjlist:[], das:[], tmidlist:[] }},onLoad() { this.getdata();},methods: { // 请求页面数据 getdata(){ var access..._uview调查问卷

python字符串的用法_mystr='itheima' mystr[1]='a' print(mystr)-程序员宅基地

文章浏览阅读320次。字符串的用法#coding:utf-8#字符串的三种风格'''print('hello world')print("hello world")print('''''')ch = '我'print(ord(ch)) #ord只能处理单个字符#字符串截取mystr = '生活中的程序员真实写照、一款游戏一包烟,一台电脑一下午。一盒泡面一壶水,一顿能关一整天'print(mystr[:]) #整个字符串print(mystr[-15:-8])print('notepad')pr_mystr='itheima' mystr[1]='a' print(mystr)

获取汉字首字母大写-程序员宅基地

文章浏览阅读510次。获取汉字首字母大写/* * 获取汉字首字母大写 * */function getFirstChar($s0){ $fchar = ord(substr($s0, 0, 1)); if (($fchar >= ord("a") and $fchar <= ord("z")) or ($fchar >= ord("A") and $fcha..._求的首字母大写

财务女,30岁无情被辞:想给财务提个醒!!-程序员宅基地

文章浏览阅读843次。最近每个人为了保住工作,都太拼了!不要说朝九晚五,朝九晚六的生活都已经不能保证了,每天10点以后下班已经成了常态,周末还要24小时待命。37岁的财务总监璐璐,以前只需要安排安排工作,等着准时下班回家陪孩子就可以了,现在为了保住工作,每天都要开会到很晚。01、工作越来越难我的一位财务朋友童童,上周突然发微信问我:“你工作快乐吗?”这简直是对社畜的灵魂拷问!但是童童一直都是懂事细心的女孩子,不会没有缘由的问出这样一句话。原来是最近的工作压力太大了,让她开始怀疑自己。硕士一毕业

黑马程序员Java零基础视频教程_上部(P129-P176)_黑马java视频-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏14次。黑马程序员Java零基础视频教程_上部(P129-P176)_黑马java视频

Course3-Week2-推荐系统-程序员宅基地

文章浏览阅读1.2k次,点赞23次,收藏19次。推荐机制、协同过滤算法、基于内容过滤、PCA主成分分析

推荐文章

热门文章

相关标签