Json与jsoncpp

目录

一、关于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.语法规则

  1. 在对象或数组中,数据项之间使用逗号分隔。
  2. 对象使用{}包围,数组使用[]包围。
  3. JSON中的键必须是字符串,并且要用双引号括起来。
  4. 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"}
]

  

参考内容:

爱编程的大丙

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【管道——二分+区间合并】

题目 思路 区间合并 1、按照左端点排序2、遍历窗口&#xff0c;若窗口非法&#xff0c;继续遍历&#xff1b;否则执行33、若是第一个窗口&#xff0c;设定合并结果初值&#xff0c;判断结果左端点是否造成“起点过大”&#xff0c;是&#xff0c;FALSE退出&#xff1b;否则执行…

语雀导入md文件图片丢失

经常被困扰是&#xff0c;从语雀导入md文件&#xff0c;即使知道把md文件和本地图片文件夹打包成zip进行导入&#xff0c;还是出现图片丢失 解决方式1&#xff1a; 把图片和md文件放到同个目录下&#xff0c;重新打包成zip文件&#xff0c;导入后有图片了 解决方式2&#xf…

Python爬虫入门指南:从零开始抓取数据

Python爬虫入门指南&#xff1a;从零开始抓取数据 引言 在大数据时代&#xff0c;数据是新的石油。而爬虫作为获取数据的重要手段&#xff0c;受到了越来越多的关注。Python作为一门强大的编程语言&#xff0c;其简洁易用的特性使得它成为爬虫开发的首选语言。本篇文章将带你…

单片机--51- RAM

1.概览某个51单片机对空间区域的划分&#xff1a; 2.RAM被分配的区域是256bytes&#xff0c; 通常8051单片机ram是128bytes 8052的ram是256bytes&#xff08;其中高128位的地址和sfr区域地址重合&#xff0c;物理区域不同&#xff09; extern uint32_t alarm_cnt_1; uint32…

145页PPT智慧矿山整体规划建设方案

本资料收录在【智慧方案文库】知识星球&#xff08;截止目前共9500份&#xff0c;PPTWORD超过7000份&#xff0c;持续上传中......&#xff09; 68页PPT丨5G智能矿山解决方案 77页PPT智慧矿山整体规划建设方案

NET拓展配置

IP地址的分类 ABC---单播地址 私网IP地址 A&#xff1a;10.0.0.0 -10.255.255.255 /8 B:172.16.0.0-172.31.255.255 /16--16b类网段 C:192.168.0.0-192.168.255.255 -- Ip地址数量不够 所有华为设备和NAT相关的配置都是在边界设备的出接口上配置 静态NAT 因为网络划分…

云效流水线使用Node构建部署前端web项目

云效流水线实现自动化部署 背景新建流水线配置流水线运行流水线总结 背景 先来看看没有配置云效流水线之前的部署流程&#xff1a; 而且宝塔会经常要求重新登录&#xff0c;麻烦的很 网上博客分享了不少的配置流程&#xff0c;这一篇博客的亮点就是不仅给出了npm命令构建&…

api接口技术开发系列如何调用电商平台的按图搜索商品API?

不同电商平台的按图搜索商品 API 调用方法大致相似&#xff0c;以下是一般的调用步骤&#xff1a; 注册与获取权限 注册账号&#xff1a;在相应的电商开放平台注册成为开发者&#xff0c;如淘宝平台、1688 平台等。创建应用&#xff1a;登录后创建应用&#xff0c;填写应用的相…

如何安装适配pytorch版本的torchvision

一、对照版本 版本对照pytorch/vision: Datasets, Transforms and Models specific to Computer Vision 二、下载对应版本的torchvision 下载连接1download.pytorch.org/whl/torch_stable.html 下载连接2download.pytorch.org/whl/cu110/torch_stable.html 笔者认为1会比2更…

深入了解PINN:物理信息神经网络(Physics-Informed Neural Networks)

1. 什么是PINN&#xff08;物理信息神经网络&#xff09;&#xff1f; 物理信息神经网络&#xff08;PINN&#xff0c;Physics-Informed Neural Networks&#xff09;是一类通过结合神经网络和物理方程的深度学习方法。其主要特点是将物理系统的约束条件&#xff08;如偏微分方…

【数据结构-堆】力扣2530. 执行 K 次操作后的最大分数

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。 在一步 操作 中&#xff1a; 选出一个满足 0 < i < nums.length 的下标 i &#xff0c; 将你的 分数 增加 nums[i] &#xff0c;并且 将 nums[i] 替换为 ceil(nums[i] / 3) 。 返回在 恰好…

我们公司只有3个人,一个前端,一个后端

在当今这个数字化时代&#xff0c;各行各业都离不开互联网技术的支撑&#xff0c;而在这股技术浪潮中&#xff0c;小而美的创业公司如同雨后春笋般涌现&#xff0c;它们凭借着灵活高效、创新不断的特点&#xff0c;在市场中占有一席之地。 今天&#xff0c;就让我带你走进这样一…

如何在 VSCode 中配置 C++ 开发环境:详细教程

如何在 VSCode 中配置 C 开发环境&#xff1a;详细教程 在软件开发的过程中&#xff0c;选择一个合适的开发环境是非常重要的。Visual Studio Code&#xff08;VSCode&#xff09;作为一款轻量级的代码编辑器&#xff0c;凭借其强大的扩展性和灵活性&#xff0c;受到许多开发者…

GNU链接器简介

GNU链接器简介 1 使用简单程序简介链接脚本1.1 测试程序1.2 编译测试程序1.2.1 不使用链接器编译1.2.1.1 不使用链接器编译1.2.1.2 读取objdump_test 的结构 1.2.2 使用链接器去链接1.2.2.1 链接脚本1.2.2.2 使用链接脚本编译1.2.2.3 读取objdump 的结构 2 链接脚本2.1 基本连接…

牛客月赛108

目录 A. 小S按按钮 C. 小T数星星 E. 小M种树 A. 小S按按钮 &#xff08;1&#xff09; 二分答案的右边界一定要开大。若 x 等于 0&#xff0c;最多 2 * y 次 &#xff08;2&#xff09;根据是要最小还是最多&#xff0c;调整 if ( check ( mid ) ) 里的是 l 还是 r #include&l…

C++语言编程————C++的输入与输出

1.面向过程的程序设计和算法 在面向过程的程序设计中&#xff0c;程序设计者必须指定计算机执行的具体步骤&#xff0c;程序设计者不仅要考虑程序要“做什么”&#xff0c;还要解决“怎么做”的问题&#xff0c;根据程序要“做什么”的要求&#xff0c;写出一个个语句&#xff…

TIM的输入捕获

IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中 我们使用测周法测频率 void IC_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphCl…

RISC-V学习笔记

1.RISC ISA1个基本整数指令集多个可选的扩展指令集&#xff0c;如RV32I表示支持32位整数指令集。I表示基本指令集&#xff0c;M表示整数乘法与除法指令集&#xff0c;A表示存储器原子指令集&#xff0c;F表示单精度浮点指令集&#xff0c;D表示双精度浮点指令集等&#xff0c;C…

Scala_【5】函数式编程

第五章 函数式编程函数和方法的区别函数声明函数参数可变参数参数默认值 函数至简原则匿名函数高阶函数函数作为值传递函数作为参数传递函数作为返回值 函数闭包&柯里化函数递归控制抽象惰性函数友情链接 函数式编程 面向对象编程 解决问题时&#xff0c;分解对象&#xff…

golang:微服务架构下的日志追踪系统(二)

背景 在使用Gin框架进行服务开发时&#xff0c;我们遇到了一个日志记录的问题。由于Gin的上下文&#xff08;*gin.Context&#xff09;实现了context.Context接口&#xff0c;在调用日志记录器的Info、Warn、Error等方法时&#xff0c;直接传递Gin的上下文通常不会导致编译错误…