一、jsoncpp简介

JsonCpp是一个开源的C++库,用于解析和生成JSON(JavaScript Object
Notation)数据格式。JSON是一种轻量级的数据交换格式,广泛用于各种应用程序和网络服务中。

JsonCpp提供了简单和易用的API,可以方便地解析JSON字符串并将其转换为C++对象,同时也可以将C++对象序列化为JSON字符串。它支持标准的JSON语法,并提供了许多功能,如访问和修改JSON对象的属性、数组操作、遍历等。

JsonCpp库的主要特点包括:

轻量级:JsonCpp具有很小的代码体积和低的内存占用,因此非常适合嵌入式系统或资源受限的环境。

跨平台:JsonCpp可以在多种操作系统上运行,包括Windows、Linux、Mac等。

简单易用:JsonCpp提供了简洁的API,使得解析和生成JSON数据变得非常容易。开发人员可以通过简单的函数调用来实现JSON数据的读取、修改和生成。

高性能:JsonCpp采用了高效的算法和数据结构,提供了快速的JSON解析和生成功能。

可靠稳定:JsonCpp经过广泛的测试和使用,已经成为一个成熟的库。它具有良好的稳定性和可靠性,可以处理各种复杂的JSON数据结构

二、下载源码

https://github.com/open-source-parsers/jsoncpp
首先阅读下面的README.md,主要看这句、合并源,我们可以点击这个链接进去
https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated- (Possibly-outdated)

Amalgamated source
https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated-(Possibly-outdated)

阅读一下这段话,也可以翻译一下

将JsonCpp集成到您的项目中的一种方法是将汇总的源代码(一个.cpp文件和两个.h文件)包含在您的项目中,并像编译和构建其他源文件一样进行编译和构建。这样可以确保编译标志的一致性和ABI兼容性,这些问题在构建共享库或静态库时会出现。下面的部分提供了详细的说明。

将include/目录添加到您的编译器包含路径中。您可以按照以下方式包含JsonCpp头文件:

#include <json/json.h>

如果在Windows上将JsonCpp构建为动态库,则项目需要定义宏JSON_DLL。

生成汇总的源代码和头文件JsonCpp提供了一个脚本用于生成单个头文件和单个源文件,以便于包含到现有项目中。可以通过从顶层目录运行以下命令随时生成汇总的源代码(需要Python3.4+):

 python amalgamate.py

您可以指定头文件名。有关详细信息,请参阅-h选项。

默认情况下,将生成以下文件:

dist/jsoncpp.cpp:需要添加到您的项目中的源文件。
dist/json/json.h:用于在项目中使用的相应头文件。与在非汇总源代码中包含json/json.h相当。此头文件仅依赖于标准头文件。
dist/json/json-forwards.h:提供所有JsonCpp类型的前向声明的头文件。汇总的源代码是通过按正确的顺序连接JsonCpp源代码并定义宏JSON_IS_AMALGAMATION来生成的,以防止包含其他头文件。

大概意思就是如果我们要是jsonCpp的库,实际上就是需要将jsoncpp.cpp,json.h,json-forwards.h添加到我们的项目当中。
那我们怎么样获得这三个文件?

下载后找到下面文件

在当前目录下打开终端,执行下面的命令

python amalgamate.py


你就可以在当前目录下找到dist目录,里面就有我们需要的三个文件

我们终于可以使用它了

三、具体应用

Json格式简介

JSON(JavaScript Object
Notation)是一种轻量级的数据交换格式,常用于在不同系统之间传输和存储数据。它具有以下特点:

可读性:JSON使用文本格式表示数据,易于阅读和理解。它采用了类似于JavaScript对象的键值对的形式来组织数据。

简洁性:JSON的语法非常简洁,相比于其他数据格式(如XML),它的数据表示更为紧凑,节省了传输和存储空间。

支持多种数据类型:JSON支持多种基本数据类型,包括字符串、数字、布尔值、数组、对象和null。这使得JSON非常灵活,可以表示各种类型的数据结构。

易于解析和生成:JSON数据可以轻松地由各种编程语言解析和生成。许多编程语言都提供了内置的JSON解析器和生成器,使得处理JSON数据变得简单和方便。

跨平台和语言无关:由于JSON是一种通用的数据格式,它不依赖于任何特定的平台或编程语言。这意味着JSON可以在不同的系统和不同的编程语言之间进行数据交换和共享。

可扩展性:JSON支持嵌套结构,允许在对象中嵌套其他对象或数组,从而实现复杂的数据结构。这种嵌套结构可以实现数据的层级关系和组织。

平台无关的数据交换格式:由于JSON的广泛支持和普及性,它已成为一种通用的数据交换格式。许多Web服务和API都使用JSON作为数据交换的标准格式。

基本示例

{"name": "John","age": 18,"isStudent": true,"hobbies": ["runing", "traveling"],"address": {"street": "999 Main St","city": "hangzhou"}
}

上述示例表示一个包含个人信息的JSON对象。它包括名称、年龄、是否是学生、兴趣爱好和地址等属性。注意JSON中使用双引号表示键和字符串值,使用逗号分隔不同的键值对,使用方括号表示数组,使用花括号表示对象

基本语法:

①.Json 键值对:键值对是 Json 的基本构成。其中,名称即对象的属性名称,必须包含在双引号( " " )中;值即对象对应的属性值;名称和值之间用冒号( : )隔开。
②.Json 值:Json 的值可以是以下几种:字符串、数字( 整型、浮点型 )、布尔值( ture、false )、空值( null )、数组、对象。
③.Json 对象:Json 对象是用大括号( {、} )括起来的一系列 Json 键值对的集合,键值对之间用逗号( , )隔开。
④.Json 数组:Json 数组是用中括号( [、] )括起来的一系列 Json 值的集合,值之间用逗号( , )隔开。

json2str

std::string json2str(const Json::Value &v, bool needFormat)
{if (needFormat){Json::StreamWriterBuilder writer;std::string jsonString = Json::writeString(writer, v);return jsonString;}else{Json::FastWriter fastWriter;return fastWriter.write(v);}
}

str2json

bool str2json(const std::string &str, Json::Value &v)
{Json::CharReaderBuilder readerBuilder;std::istringstream iss(str);std::string errs;bool parsingSuccessful = Json::parseFromStream(readerBuilder, iss, &v, &errs);if (!parsingSuccessful){std::cout << "Failed to parse JSON: " << errs << std::endl;return false;}return true;
}

str2file

bool str2file(const std::string &path, const std::string &data)
{std::ofstream file(path);if (!file.is_open()){return false;}file << data;file.close();return true;
}

file2json

bool file2json(const std::string &file, Json::Value &v)
{std::ifstream inputFile(file);if (!inputFile.is_open()){std::cout << "Failed to open file: " << file << std::endl;return false;}Json::CharReaderBuilder readerBuilder;std::string errs;bool parsingSuccessful = Json::parseFromStream(readerBuilder, inputFile, &v, &errs);inputFile.close();if (!parsingSuccessful){std::cout << "Failed to parse JSON: " << errs << std::endl;return false;}return true;
}

main

int main()
{// 创建一个Json::Value对象Json::Value root;Json::Value rootaddress;// 添加数据到Json对象root["name"] = "xiaolan";              // 字符串root["age"] = 18;                      // 数字root["isStudent"] = true;              // bool类型Json::Value hobbies(Json::arrayValue); // 创建包含兴趣爱好的 JSON 数组hobbies.append("running");hobbies.append("traveling");root["hobbies"] = hobbies;Json::Value address; // 创建嵌套的 JSON 对象address["street"] = "321 Main St";address["city"] = "hangzhou";root["address"] = address;std::cout << "root: " << root << std::endl;// 生成 JSON 字符串std::string jsonString = json2str(root, true); // 转换为带格式的 JSON 字符串std::cout << "带格式jsonString: " << jsonString << std::endl;jsonString = json2str(root, false); // 转换为紧凑的 JSON 字符串std::cout << "紧凑jsonString: " << jsonString << std::endl;// 字符串变为jsonstd::string jsonString1 = "{\"address\":{\"city\":\"hangzhou\",\"street\":\"999 Main St\"},\"age\":18,\"hobbies\":[\"running\",\"traveling\"],\"isStudent\":true,\"name\":\"xiaolan\"}";Json::Value root1;if (str2json(jsonString, root1)){std::cout << "root1: " << root1 << std::endl;// JSON 解析成功,可以访问解析后的数据// std::string name = root1["name"].asString();// int age = root1["age"].asInt();// bool isStudent = root1["isStudent"].asBool();// std::string street = root1["address"]["street"].asString();// std::string city = root1["address"]["city"].asString();// std::cout << "Name: " << name << std::endl;// std::cout << "Age: " << age << std::endl;// std::cout << "Is Student: " << (isStudent ? "true" : "false") << std::endl;// std::cout << "Street: " << street << std::endl;// std::cout << "City: " << city << std::endl;}// 字符串写入文件str2file("tempfile.json", json2str(root1, true));// 从文件当中读出来JSONstd::string filePath = "tempfile.json";Json::Value root2;if (file2json(filePath, root2)){std::cout << "root2: " << root2 << std::endl;// JSON 解析成功,可以访问解析后的数据// std::string name = root2["name"].asString();// int age = root2["age"].asInt();// bool isStudent = root2["isStudent"].asBool();// std::string street = root2["address"]["street"].asString();// std::string city = root2["address"]["city"].asString();// std::cout << "Name: " << name << std::endl;// std::cout << "Age: " << age << std::endl;// std::cout << "Is Student: " << (isStudent ? "true" : "false") << std::endl;// std::cout << "Street: " << street << std::endl;// std::cout << "City: " << city << std::endl;}return 0;
}

参考:
最新版 JsonCpp 的下载、编译、及使用

json库——jsoncpp相关推荐

  1. C++ JSON 库 jsoncpp 新API的使用方法(CharReaderBuilder / StreamWriterBuilder)

    既然看到了这篇文章你肯定知道Json是什么东西了,网上有很多解析Json的开源库,最近工作需要用到Json解析,研究发现jsoncpp使用很方便,网上也有很多使用方法介绍,目前为止能查到的基本都是比较 ...

  2. Linux下Json库的编译及代码测试

    一.Json基础 JSON(JavascriptObject Notation)是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读.尽管JSON是在Javascript的一个子集,但JSON是独 ...

  3. C++用库 jsoncpp 解析 JSON

    使用C++处理JSON数据交换格式(转自http://hi.baidu.com/%D3%C3%B1%F8%C8%E7%C9%F1garbin/blog/item/85c602edd7f9a7fbcf1 ...

  4. Json及Jsoncpp开源库的应用

    目录 前言 1.JSON 1.1 Json数组 1.2 Json对象 1.3 注意事项 2.Jsoncpp 2.1 下载 2.2 Jsoncpp的使用 2.2.1 Value类 2.2.2 FastW ...

  5. c++json库(jsoncpp)简单使用(包含下载使用方法,中文错误解决方案)

    c++json库(jsoncpp)简单使用方法(含下载) 下载地址:jsoncpp的github仓库地址:open-source-parsers/jsoncpp: A C++ library for ...

  6. 一个好用的C++的json库

    此文首发于我的个人博客:一个好用的C++的json库 - zhang0peter的个人博客 今天在找可以在C++中用的JSON库. 一个比较好用的传统的JSON库是JsonCpp, GitHub地址: ...

  7. Mac OS X下使用C++ JSON库

    1. 下载C++ JSON库 http://sourceforge.net/projects/jsoncpp/files/ 2. 下载scons http://sourceforge.net/proj ...

  8. linux下使用C++ Json库

    安装Json库 1.下载JsonCpp http://sourceforge.net/projects/jsoncpp/files/ 2.下载scons http://sourceforge.net/ ...

  9. cocos2d-x自代的Json库解析json(转)

    之前在2.0.3版本的时候用过一个jsonCpp的库,不过后来的版本是好像加入了json库,因为cocostudio导出的界面数据和骨格动画数据用的其实就是json文件.没有看库里边是怎么解析的,在网 ...

最新文章

  1. ajax跨界表单,ajax使用jsonp解决跨域问题
  2. 基于 Docker 和 GitLab 的前端自动化部署实践笔记
  3. Java接受blob类型图片_原生JS上传图片接收服务器端图片并且显示图片(主要描述blob类型)...
  4. MongoDB学习总结(一) —— Windows平台下安装
  5. 十六进制,输出的时候怎样控制所输出字母的大小写。
  6. mysql中有没有单行函数_MySQL之函数(单行函数、分组函数)
  7. 使用了BeanUtils的简单操作
  8. Python格式化输出方法
  9. 传感器绕着世界坐标系旋转产生的疑惑
  10. Beta冲刺 day7
  11. java下载远程文件到本地
  12. MySQL服务 - 客户端工具mysql及mysqladmin使用介绍
  13. android浏览器病毒,2018安卓手机杀毒软件排行榜
  14. 自然辩证法论文 计算机,自然辩证法课程论文-自然辩证法与计算机科学技术的研究.doc...
  15. 北辰创业笔记:百度引流推广有用吗?百度引流最有效的方法
  16. np.array数组的切片
  17. 网络负载均衡优化RPS实现简介
  18. java压缩文件或文件夹并返回流给前端
  19. CoolFormat源代码格式化工具
  20. 2020预推免经验总结:浙大计算机直博,西交计算机直博,北理工网络空间安全,天大计算机,西工大计算机......

热门文章

  1. Postman接口自动化测试之——批量执行(集合操作)
  2. 网吧服务器设置全攻略
  3. python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)
  4. 量子风暴-尝试用游戏讲述量子论的设想及实现-1
  5. 使用HTML5和CSS3第一章HTLM5基础课后作业
  6. linux网卡抓包命令,基于Linux Socket实现的网卡抓包程序
  7. web前端学习156-161(案例1:产品模块---小米手机产品)
  8. 脊波变换 matlab,浅析curvelet变换原理与理解 - 全文
  9. 洛谷P1072 Hankson 的趣味题(题解)
  10. 五、Python数据类型--整数