C++操作.json文件的超详细新手教程

目录
  • 1.JSON简介
    • 1.1 什么是JSON:
    • 1.2 JSON的优缺点:
    • 1.3 JSON的存储:
  • 2.jsoncpp库介绍
    • 2.1 jsoncpp库的配置使用:
    • 2.2 jsoncpp库内部构成:
  • 3.json文件读取(例)
    • 3.1 json文件:
    • 3.2 源码:
    • 3.3 结果图:
  • 总结

1.JSON简介

1.1 什么是JSON:

JSON是一种纯字符串形式的数据,它本身不提供任何方法(函数),非常适合在网络中进行传输。JavaScript、PHP、Java、Python、C++等编程语言都内置了处理JSON数据的方法。

JSON 是基于 JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集,是一种开放的、轻量级的数据交换格式,采用独立于编程语言的文本格式来存储和表示数据,易于程序员阅读与编写,同时也易于计算机解析和生成,通常用于在 Web 客户端(浏览器)与 Web 服务器端之间传递数据。

在JSON中,使用一下两种方式表示数据:

  • object(对象):键/值对(名称/值)的集合,使用花括号{}定义。在每个键/值对中,以键开头,后跟一个冒号,最后是值。多个键/值对之间使用逗号分隔,例如"name":"FilterWindow","paramtype":"0"
  • Array(数组):值的有序集合,使用方括号[]定义,数组中每个值之间使用逗号进行分隔。

下面展示一个简单的JSON数据:

{
	"name" : "FilterWindow",
	"paramtype" : "0",
	"range" :
	{
		"max" : 99,
		"min" : 3
	},
	"required" : true,
	"title" : "滤波窗口大小",
	"type" : "int",
	"value" : 51
	"tempValue" :
	[
		"不生成" : 1,
		"生成" : 0
	],
}

1.2 JSON的优缺点:

优点:

  相对于txt,word来说,json格式更加明确,获取重要信息非常方便。

  相对于xml来说,json格式更加简洁,存储同样的文件,花费的内存更小。

  相对于Excel来说,json更适合存储字符类文件。Excel相当于比较简单的数据库了。

  相对于数据库来说,json更加方便,数据库我们还需要做一些设置,安装一些软件。json可以直接使用。

缺点:

  只有一种数字类型:JSON中只能支持IEEE-754双精度浮点格式,因此我们无法使用JSON来存储许多编程语言中多样化的数字类型;

  没有日期类型:在JSON中我们只能通过日期的字符串(例如:1970-01-01)或者时间戳(例如:1632366361)来表示日期;

  没有注释:在JSON中无法添加注释;

  冗长:虽然JSON比XML更加简洁,但它不是最简洁的数据交换格式,对于数据量庞大或用途特殊的服务,我们需要更加高效的数据格式。

1.3 JSON的存储:

JSON数据可以存储在.json格式的文件中(与.txt格式类似,都属于纯文本文件),也可以将JSON数据以字符串的形式存储在数据库、Cookie、Session中。要使用存储好的JSON数据也非常简单,不同的编程语言中提供了不同的方法来检索和解析JSON数据,今天我们的重点就是使用C++来操作.json文件。而C++主要使用jsoncpp这个跨平台的开源库来实现对.json文件的各类操作。

2.jsoncpp库介绍

2.1 jsoncpp库的配置使用:

这里我就不按照网上常规的方式来介绍了,常规的方法无非是关于下载jsoncpp库,然后使用Windows编译(vs2015),最后整理出include及lib来使用jsoncpp库。我这里是整理好的,是直接把include里的所有文件集合成json.h以及json.cpp。用的时候直接把这些文件包含进自己的项目一起编译即可。

2.2 jsoncpp库内部构成:

jsoncpp主要包含三个class(类):Value、Reader、Writer。注意Json::Value只能处理ANSI类型的字符串,如果C++程序是用Unicode编码的,最好加一个Adapt类来适配。

Value: 是jsoncpp中最基本、最重要的类,用于表示各种类型的对象,jsoncpp支持的对象类型可见下面的Json::ValueType枚举值;Value类的对象代表一个JSON,既可以代表一个文档,也可以代表文档中一个值。如同JSON中定义的“值”一样,Value是递归的。

enum ValueType
   {
      nullValue = 0, ///< 'null' value
      intValue,      ///< signed integer value
      uintValue,     ///< unsigned integer value
      realValue,     ///< double value
      stringValue,   ///< UTF-8 string value
      booleanValue,  ///< bool value
      arrayValue,    ///< array value (ordered list)
      objectValue    ///< object value (collection of name/value pairs).
   };

Value类里的函数如下所示:

1、【构造函数】
Value( ValueType type = nullValue );
Value( Int value );
Value( UInt value );
Value( double value );
Value( const char *value );
Value( const char *beginValue, const char *endValue );
2、【拷贝构造函数】
Value( const StaticString &value );
Value( const std::string &value );
Value( const Value &other );
3、【相同类型的比较、交换、类型的获取】
void swap( Value &other );
ValueType type() const;
int compare( const Value &other );
4、【相应的赋值运算符的重载函数】
Value &operator=( const Value &other );
bool operator <( const Value &other ) const;
bool operator <=( const Value &other ) const;
bool operator >=( const Value &other ) const;
bool operator >( const Value &other ) const;
bool operator ==( const Value &other ) const;
bool operator !=( const Value &other ) const;
bool operator!() const;
Value &operator[]( UInt index );
const Value &operator[]( UInt index ) const;
5、【将Value对象进行相应的类型转换】
const char *asCString() const;
std::string asString() const;
const char *asCString() const;
std::string asString() const;
Int asInt() const;
UInt asUInt() const;
double asDouble() const;
6、【相应的判断函数】
bool isNull() const;
bool isBool() const;
bool isInt() const;
bool isUInt() const;
bool isIntegral() const;
bool isDouble() const;
bool isNumeric() const;
bool isString() const;
bool isArray() const;
bool isObject() const;
bool isConvertibleTo( ValueType other ) const;
bool isValidIndex( UInt index ) const;
bool isMember( const char *key ) const;
bool isMember( const std::string &key ) const;
7、【清除和扩容函数】
void clear();
void resize( UInt size );
8、【获取满足相应条件的Value】
Value get( UInt index, const Value &defaultValue ) const;
Value get( const std::string &key,const Value &defaultValue ) const;
Members getMemberNames() const;
9、【删除满足相应条件的Value】
Value removeMember( const char* key );
Value removeMember( const std::string &key );
10、【】
void setComment( const char *comment,CommentPlacement placement );
void setComment( const std::string &comment,CommentPlacement placement );
bool hasComment( CommentPlacement placement ) const;
std::string getComment( CommentPlacement placement ) const;
std::string toStyledString()const;

Reader :是用于读取的,确切说是用于将字符串转换为Json::Value对象的。

1、【构造函数】
Reader();
2、【拷贝构造函数】
Reader( const Features &features );
3、【将字符串或者输入流转换为JSON的Value对象】【下边是相应的parse的重载函数】
bool parse( const std::string &document, Value &root,bool collectComments = true );
bool parse(const char *beginDoc, const char *endDoc, Value &root,bool collectComments = true)
bool parse( std::istream &is,Value &root,bool collectComments = true );
4、【】
std::string getFormatedErrorMessages() const;

Writer :是一个纯虚类,并不能直接使用。在此我们使用Json::Writer的子类(派生类):Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。顾名思义,用Json::FastWriter来处理json应该是最快的;负责将内存中的Value对象转换成JSON文档,输出到文件或者字符串中。

 1、【FastWriter】
FastWriter();
virtual ~FastWriter(){}
void enableYAMLCompatibility();
virtual std::string write( const Value &root );
2、【StyledWriter】
StyledWriter();
virtual ~StyledWriter(){}
virtual std::string write( const Value &root );

3.json文件读取(例)

3.1 json文件:

{
  "face": [
    {
      "attribute": {
        "age": {
          "range": 5,
          "value": 35
        },
        "gender": {
          "confidence": 99.9995,
          "value": "Male"
        },
        "glass": {
          "confidence": 98.8995,
          "value": "None"
        },
        "pose": {
          "pitch_angle": {
            "value": -0.000006
          },
          "roll_angle": {
            "value": 5.32508
          },
          "yaw_angle": {
            "value": -22.432627
          }
        },
        "race": {
          "confidence": 98.62100000000001,
          "value": "Asian"
        },
        "smiling": {
          "value": 97.3715
        }
      },
      "face_id": "2f60c56506b691c0384e2694fed1c819",
      "position": {
        "center": {
          "x": 51.463415,
          "y": 25.121951
        },
        "eye_left": {
          "x": 46.197561,
          "y": 20.161
        },
        "eye_right": {
          "x": 56.724146,
          "y": 21.142171
        },
        "height": 22.926829,
        "mouth_left": {
          "x": 45.610732,
          "y": 30.399024
        },
        "mouth_right": {
          "x": 56.01561,
          "y": 31.734146
        },
        "nose": {
          "x": 49.063659,
          "y": 27.171951
        },
        "width": 22.926829
      },
      "tag": ""
    }
  ],
  "img_height": 410,
  "img_id": "84c20011223acd4efa0b5aa13fc2146d",
  "img_width": 410,
  "session_id": "42c5db376fdc4da9855d0135b5e414e2",
  "url": "http://www.faceplusplus.com.cn/wp-content/themes/faceplusplus/assets/img/demo/16.jpg?v=2"
}

3.2 源码:

#include<iostream>
#include<fstream>
#include<assert.h>
#include "json.h"

using namespace std;

int main()
{
	Json::Reader reader;
	Json::Value root;

	ifstream is;  

	is.open("face.json", ios::binary);

	if (reader.parse(is, root))
	{
		Json::StyledWriter sw;     //缩进输出
		cout << "缩进输出" << endl;
		cout << sw.write(root) << endl << endl;
	}
	return 0;
}

3.3 结果图:

总结

到此这篇关于C++操作.json文件的文章就介绍到这了,更多相关C++操作.json文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++使用cjson操作Json格式文件(创建、插入、解析、修改、删除)

    目录 为什么要学习解析Json文件? 一.准备cJSON开源库 二.cJSON介绍 三.封装Json 四.解析Json 五.修改Json 六.删除Json 七.全部代码 八.总结 为什么要学习解析Json文件? 工作需要呗! 最近在工作项目中,有需求是需要进行解析Json字符串的,但是我只会使用QT去解析Json,且主管规定要使用C/C++语言去解析,说是为了方便移植到其他项目中进行使用… 没办法,只能硬着头皮,在网上找找有没有什么解析Json的开源库是C/C++可以使用的.找了许多,网上也提供

  • C/C++ QT实现解析JSON文件的示例代码

    JSON是一种轻量级的数据交换格式,它是基于ECMAScript的一个子集,使用完全独立于编程语言的文本格式来存储和表示数据,简洁清晰的的层次结构使得JSON成为理想的数据交换语言,Qt库为JSON的相关操作提供了完整的类支持. 创建一个解析文件,命名为config.json我们将通过代码依次解析这个JSON文件中的每一个参数,具体解析代码如下: { "blog": "https://www.cnblogs.com/lyshark", "enable&qu

  • C++操作json文件以及jsoncpp配置详解

    前言 json文件是比较轻量级的文件,格式简单,使用方便.用来存放信息相比其他方式有自己得天独厚的优势. 今天给大家分享的是如何利用C++来操作json文件. 如果你知道如何使用jsoncpp类库,可以不用看附,如果第一次使用,请先到最后,将环境配置好,再进行操作. 一.json文件简介 1.json文件 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完

  • C++操作.json文件的超详细新手教程

    目录 1.JSON简介 1.1 什么是JSON: 1.2 JSON的优缺点: 1.3 JSON的存储: 2.jsoncpp库介绍 2.1 jsoncpp库的配置使用: 2.2 jsoncpp库内部构成: 3.json文件读取(例) 3.1 json文件: 3.2 源码: 3.3 结果图: 总结 1.JSON简介 1.1 什么是JSON: JSON是一种纯字符串形式的数据,它本身不提供任何方法(函数),非常适合在网络中进行传输.JavaScript.PHP.Java.Python.C++等编程语言

  • 如何基于python操作json文件获取内容

    这篇文章主要介绍了如何基于python操作json文件获取内容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 写case时,将case 写到json文件比写到,写python一定要学会处理json 以下,是要处理的json 处理操作包括:打开json文件,获取json文件内容,关闭json文件,读取内容中的对应key的value { "name": "BeJson", "url": "

  • windows系统下SQL Server 2008超详细安装教程

    目录 1.解压文件后,双击setup.exe安装文件 2.打开后点击界面左侧的[安装],然后点击右侧的[全新SQL Server 独立安装或向现有安装添加功能] 3.进入[SQL Server 2008 安装程序]界面,首先是[安装程序支持规则] 4.无异常后点击“确定” 5.进入“产品密钥”页面 6.阅读软件许可条款,选择我接受许可条款,否则将无法使用此软件,点击下一步 7.点击安装 8.安装成功后点击下一步 9.点击“全选”并下一步 10.进入[实例配置],全部选择默认,点击[下一步] 11

  • windows安装python超详细图文教程

    一.下载安装包 官网下载:python 3.6.0 打开链接滑到页面最下方 二. 开始安装 1.双击下载好的安装文件python-3.6.0-amd64.exe Install Now :默认安装 Customize Installation:自定义安装 Add Python 3.6 to PATH: 将python 加入环境变量 2.勾选Add Python 3.6 to PATH后,选择Customize Installation自定义安装 3.点击Next进行下一步 Install for

  • Mybatis-Plus Wrapper条件构造器超详细使用教程

    目录 Wrapper条件构造器 1 queryWrapper构造器 1.1 组装删改查条件 1.2 条件优先级 1.3 实现子查询 2 updateWrapper构造器 2.1 升级修改方法(无需创建对象) 2.2 实际开发时的应用 3 lambdaXxxWrapper构造器 3.1 lambdaQueryWrapper构造器 3.2 lambdaUpdateWrapper构造器 Wrapper条件构造器 条件构造器wrapper就是用来封装CRUD方法参数条件的一个接口,其底层有很多的子类,最

  • IDEA 2020 2全家桶安装激活超详细图文教程

    IDEA-2020-2 全家桶激活超详细教程,详细步骤如下所示: 步骤一:  点击安装 步骤二: 进入安装页面, 直接Next 步骤三: 安装可能有两种情况,一种是新电脑刚安装,一种是电脑已安装旧版本,就版本的值需要如下图,就可以直接使用以前的配置,不需要卸载旧版本 如果是新电脑,就可能跳出不一样页面,没有设置存储,只需要如下选择即可 步骤四:选择安装位置 步骤五:创建桌面快捷 步骤六: 点击Install 安装 步骤七: 安装完成 步骤七点五:直接双击桌面快捷启动,弹框选择 步骤八: 然后进行

  • Idea配置超详细图文教程(2020.2版本)

    Idea配置(2020.2版本)1.Idea 设置字体2.Idea配置Maven3.不区分大小写4.自动导包功能及相关优化功能5.自动编译6.多行显示7.单词拼写检查8.idea中 类中显示成员变量和方法9.idea中 查看 类的关系图10.idea中 切换背景图片11.idea中 File Type 过滤12.手动加入快捷键设置 1.Idea 设置字体 settings --> Editor --> Font 2.Idea配置Maven Settings --> Build Tools

  • IDEA 2020 2全家桶安装激活超详细图文教程

    推荐阅读: 最新idea2020注册码永久激活(激活到2100年) https://www.jb51.net/article/178193.htm IntelliJ IDEA 2020最新激活码(亲测有效,可激活至 2089 年) https://www.jb51.net/article/184631.htm IDEA-2020-2 全家桶激活超详细教程,详细步骤如下所示: 步骤一:  点击安装 步骤二: 进入安装页面, 直接Next 步骤三: 安装可能有两种情况,一种是新电脑刚安装,一种是电脑

  • xmind2022下载非试用超详细图文教程

    目录 1. 下载文件展示 2. xmind下载 3. 关键步骤 4. 关闭更新 先来一个官网链接:https://www.xmind.cn/有钱的也可以支持一波 然后开始吧– 百度网盘获取地址: 链接: https://pan.baidu.com/s/1DT3Xu-hbakIh5soflJqyhw?pwd=6cuu 提取码: 6cuu 1. 下载文件展示 文件名“xmind12”,下载完打开文件夹界面 2. xmind下载 直接双击,自动安装到C盘,安装完自动打开,此时还是试用版!!! 3. 关

随机推荐