当前位置: 首页 > article >正文

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.kler.cn/a/467545.html

相关文章:

  • vue2项目报错You may need an appropriate loader to handle this file type
  • Which CAM is Better for Extracting Geographic Objects? A Perspective From参考文献
  • hot100_54. 螺旋矩阵
  • 125个Docker的常用命令
  • v-model与 mvvm 回顾
  • 【跟着官网学技术系列之MySQL】第2天之MySQL版本:创新和 LTS
  • 使用 Jupyter Notebook:安装与应用指南
  • 深度学习中的步数指的是什么
  • 【含开题报告+文档+PPT+源码】基于SpringBoot的线上动物园售票系统设计
  • Python 基于 opencv 的人脸识别监控打卡系统(源码+部署)
  • RocketMQ消费者如何消费消息以及ack
  • 继承(3)
  • Xilinx Vivado环境下载bit后自动触发ILA采集
  • TradingView功能
  • Chain of Agents(COA):大型语言模型在长文本任务中的协作新范式
  • 【Go学习】-01-5-网络编程
  • 前端网站部署遇到的问题
  • 牛客网刷题 ——C语言初阶(5操作符)——BC111 小乐乐与进制转换
  • 前端路由 Hash 和 History 模式原理对比区别
  • GNU链接器简介
  • 【算法刷题】链表
  • 1.4 java反射机制 简单的java反射机制实践
  • Linux修改磁盘UUID
  • 【openwrt】OpenWrt 路由器的 802.1X 动态 VLAN
  • 代码随想录算法训练营第五十天|图论基础|深度优先搜索理论基础|KM98.所有可达路径|广度优先搜索理论基础
  • 中高级运维工程师运维面试题(十一)之 Docker