广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Linux系统下如何使用C++解析json文件详解
  • 616
分享到

Linux系统下如何使用C++解析json文件详解

2024-04-02 19:04:59 616人浏览 八月长安
摘要

1. 背景 工作需要,下班回来自己造轮子,记录以后查阅。 JSON(javascript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要lin

1. 背景

工作需要,下班回来自己造轮子,记录以后查阅。

JSON(javascript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要linux下使用jsoncpp解析json的方法做一下记录。

2. 关于jsoncpp库的使用简介

使用jsoncpp有两种方法

方法一:使用Jsoncpp生成的lib文件

      解压上面下载的Jsoncpp文件,在jsoncpp默认生成静态链接库。 在工程中引用,只需要包含include/json下的头文件及生成的.lib文件即可。

方法二:使用Jsoncpp包中的.cpp和.h文件

      解压上面下载的Jsoncpp文件,把jsoncpp-src-0.5.0文件拷贝到工程目录下,将jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json和jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json目录里的文件包含到VS工程中,在VS工程的属性C/C++下General中Additional Include Directories包含头文件目录.\jsoncpp-src-0.5.0\include。在使用的cpp文件中包含json头文件即可,如:#include "json/json.h"。将json_reader.cpp、json_value.cpp和json_writer.cpp三个文件的Precompiled Header属性设置为Not Using Precompiled Headers,否则编译会出现错误。

我上面的都是采用第一种方法

jsoncpp 使用详解

jsoncpp 主要包含三种类型的 class:Value、Reader、Writer。jsoncpp 中所有对象、类名都在 namespace Json 中,包含 json.h 即可。

Json::Value 只能处理 ANSI 类型的字符串,如果 c++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配。

3. linux下jsoncpp环境配置

3.1 jsoncpp源码下载

直接在GitHub搜索jsoncpp即可。给出下载连接:https://github.com/open-source-parsers/jsoncpp

3.2 具体配置步骤

1> 解压源码

2> 在源码目录的上一层新建build目录,用来保存编译过程生成的中间文件

3> 在build目录执行cmake ..

4> 在build目录执行make

5> 在build目录下执行make install

查看安装在本地的jsoncpp库

ls /usr/local/include     ls/usr/local/lib

4. 使用c++读取json文件示例

demo.json文件【源码直接抄录自Https://blog.csdn.net/shuiyixin/article/details/89330529】


{
   "age" : 21,
   "friends" : {
      "friend_age" : 21,
      "friend_name" : "ZhaoWuxian",
      "friend_sex" : "man"
   },
   "hobby" : [ "sing", "run", "Tai Chi" ],
   "name" : "shuiyixin",
   "sex" : "man"
}

test.cpp文件


#include <iOStream>
#include <json/json.h>
#include <fstream>
 
using namespace std;
 
void readFileJson()
{
        Json::Reader reader;
        Json::Value root;
 
        //从文件中读取,保证当前文件有demo.json文件  
        ifstream in("demo.json", ios::binary);
 
        if (!in.is_open())
        {
                cout << "Error opening file\n";
                return;
        }
 
        if (reader.parse(in, root))
        {
                //读取根节点信息  
                string name = root["name"].asString();
                int age = root["age"].asInt();
                string sex = root["sex"].asString();
 
                cout << "My name is " << name << endl;
                cout << "I'm " << age << " years old" << endl;
                cout << "I'm a " << sex << endl;
				
				//读取子节点信息  
                string friend_name = root["friends"]["friend_name"].asString();
                int friend_age = root["friends"]["friend_age"].asInt();
                string friend_sex = root["friends"]["friend_sex"].asString();
 
                cout << "My friend's name is " << friend_name << endl;
                cout << "My friend's sex is "<<friend_sex << endl;
                cout << "My friend is " << friend_age << " years old" << endl;
 
                //读取数组信息  
                cout << "Here's my hobby:" << endl;
                for (unsigned int i = 0; i < root["hobby"].size(); i++)
                {
                        string ach = root["hobby"][i].asString();
                        cout << ach << '\t';
                }
                cout << endl;
 
                cout << "Reading Complete!" << endl;
        }
        else
        {
                cout << "parse error\n" << endl;
        }
 
        in.close();
}
 
int main(void)
{
        readFileJson();
        return 0;
}

执行结果如下:

5. 使用c++写入json文件示例

test.cpp文件:


#include <iostream>
#include <json/json.h>
#include <fstream>
 
using namespace std;
 
 
void writeFileJson()
{
	//根节点  
	Json::Value root;
 
	//根节点属性  
	root["name"] = Json::Value("shuiyixin");
	root["age"] = Json::Value(21);
	root["sex"] = Json::Value("man");
 
	//子节点  
	Json::Value friends;
 
	//子节点属性  
	friends["friend_name"] = Json::Value("ZhaoWuxian");
	friends["friend_age"] = Json::Value(21);
	friends["friend_sex"] = Json::Value("man");
 
	//子节点挂到根节点上  
	root["friends"] = Json::Value(friends);
 
	//数组形式  
	root["hobby"].append("sing");
	root["hobby"].append("run");
	root["hobby"].append("Tai Chi");
 
	//直接输出  
	//cout << "FastWriter:" << endl;
	//Json::FastWriter fw;
	//cout << fw.write(root) << endl << endl;
 
	//缩进输出  
	cout << "StyledWriter:" << endl;
	Json::StyledWriter sw;
	cout << sw.write(root) << endl << endl;
 
	//输出到文件  
	ofstream os;
	os.open("demo.json", std::ios::out | std::ios::app);
	if (!os.is_open())
		cout << "error:can not find or create the file which named \" demo.json\"." << endl;
	os << sw.write(root);
	os.close();
 
}
 
 
int main(void)
{
        writeFileJson();
        return 0;
}

执行结果如下:可以看到已经在目录新建了demo.json文件,并且写入成功

要注意的是:

1.如果要写入的文件不存在,会自动创建该文件;

2.如果文件存在,写入过程不会覆盖文件中原有数据,而是将新数据写在原有数据后面。

6. 从字符串解析json

在实际项目中更多使用的是从文件解析json,从字符串解析json示例只是为了完整记录。

6.1 简单json样式字符串解析示例


#include <iostream>
#include <json/json.h>
#include <fstream>
 
using namespace std;
 
 
void readStrJson()
{
	//字符串  
	const char* str =
	"{\"name\":\"shuiyixin\",\"age\":\"21\",\"sex\":\"man\"}";
//	"{
//		"name" : "shuiyixin",
//		"age" : "21",
//		"sex" : "man"
//	}";
 
 
	Json::Reader reader;
	Json::Value root;
 
	//从字符串中读取数据  
	if (reader.parse(str, root))
	{
		string name = root["name"].asString();
		int age = root["nomen"].asInt();
		string sex = root["sex"].asString();
		cout << name + "," << age << "," << sex <<  endl;
	}
 
}
 
int main(void)
{
        readStrJson();
        return 0;
}

执行结果如下:

6.2 复杂json样式字符串解析示例


#include <iostream>
#include <json/json.h>
#include <fstream>
 
using namespace std;
 
void readStrProJson()
{
	string strValue = "{\"name\":\"shuiyixin\",\"major\":[{\"AI\":\"MachineLearning\"},{\"AI\":\"DeepLearning\"},{\"AI\":\"ComputerVision\"}]}";
	
	
	
	
	Json::Reader reader;
	Json::Value value;
	if (reader.parse(strValue, value))
	{
		string out = value["name"].asString();
		cout << out << endl;
		const Json::Value arrayObj = value["major"];
		for (unsigned int i = 0; i < arrayObj.size(); i++)
		{
			out = arrayObj[i]["AI"].asString();
			cout << out<<endl;
		}
	}
}
 
int main(void)
{
        readStrProJson();
        return 0;
}

执行结果如下:

参看连接:

https://www.jb51.net/article/214039.htm

https://www.jb51.net/article/214051.htm

总结

到此这篇关于Linux系统下如何使用C++解析json文件的文章就介绍到这了,更多相关Linux C++解析json文件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Linux系统下如何使用C++解析json文件详解

本文链接: https://www.lsjlt.com/news/127471.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux系统下如何使用C++解析json文件详解
    1. 背景 工作需要,下班回来自己造轮子,记录以后查阅。 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要Lin...
    99+
    2022-11-12
  • C/C++ QT如何实现解析JSON文件
    这篇“C/C++ QT如何实现解析JSON文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C/C++ ...
    99+
    2023-06-26
  • linux系统下hosts文件详解及配置
     hosts文件   hosts —— the static table lookup for host name(主机名查询静态表)。   hosts文件是Linux系统上一个负责ip地址与域名快速解...
    99+
    2022-06-04
    详解 文件 系统
  • Linux系统下如何解压zip文件
    这篇文章主要介绍Linux系统下如何解压zip文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux系统里的zip是一种创建压缩存档文件的常用方式,同时也是最流行的文件归档文件格式。为了解压 zip 归档文件,...
    99+
    2023-06-28
  • Linux系统下gcc命令使用详解
    目录一.预处理二. 编译三.汇编四.链接1.gcc的安装(以Ubuntu为例) sudo apt-get install build-essential 安装完后可以通过 gcc --version 查看版本。 让我们在...
    99+
    2022-06-04
    Linux GCC命令的详解 linux安装gcc命令
  • Linux下如何使用XFS文件系统
    这篇文章主要介绍Linux下如何使用XFS文件系统,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!XFS是高性能文件系统,由于它的高性能,XFS成为了许多企业级系统的首选,特别是有大量数据,需要结构化伸缩性和稳定性的。...
    99+
    2023-06-28
  • Linux下core文件的使用方法详解
    前言 有时候程序会异常退出而不带任何日志,此时就可以使用 code 文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息 什么是core文件 通常在 linux 下遇到程序异常退出或者中止,我们都会使用 cor...
    99+
    2022-06-04
    linux core文件 linux下core文件 linux生成core文件
  • Ubuntu下如何创建XFS文件系统的LVM详解
    前言 lvm(Logical Volume Manager) 逻辑卷管理, 可以满足linux系统动态调整各分区大小,满足服务器在不同的运行时期的需求。 以前在Linux下面玩LVM,一般都是选择ext3、ext4格式的...
    99+
    2022-06-04
    linux xfs文件系统 xfs文件系统 xfs文件系统格式
  • Linux系统如何解压zip文件
    本篇文章为大家展示了Linux系统如何解压zip文件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。zip是最流行也是最广泛的一种压缩方法,那么在Linux系统中如何解压呢?先决条件:检查你是否安装了...
    99+
    2023-06-28
  • 如何使用Linux下NFS网络文件系统
    本篇内容主要讲解“如何使用Linux下NFS网络文件系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Linux下NFS网络文件系统”吧!0.什么是NFS(Network FileSys...
    99+
    2023-06-12
  • Linux下利用unzip命令如何解压多个文件详解
    linux中提示没有unzip命令解决方法 如果你如法使用unzip命令解压.zip文件,可能是你没有安装unzip软件,下面是安装方法 命令: yum list | grep zip/unzip #获取安装列表 安装...
    99+
    2022-06-04
    linuxunzip解压命令 linux解压unzip文件命令 linuxunzip命令
  • Linux文件服务器实战详解(系统用户)
     ftp匿名用户设置完成之后任何人都可以访问服务器端文件,目录,甚至可以修改删除文件和目录,,那如何存放私密文件并保证文件或者目录专属于拥有者呢,就需要使用vsftp系统用户来实现了。 1.在linux系统创建...
    99+
    2022-06-04
    linux 文件服务器
  • 一文详解如何根据后端返回的url下载json文件
    目录需求场景描述实现思路分析完整的 demo 示例总结需求场景描述 有时候会遇到异步接口会返回一个 url 地址,然后前端需要根据这个 url 地址去下载文件资源的需求场景。 而这个...
    99+
    2022-11-13
  • 图文详解如何下载win10系统方法
    当前,微软的Windows操作系统已经升级至Windows 10版本。许多之前使用Windows 7系统的用户都希望尝试一下最新的Windows 10系统。赶快来看看,本文将介绍如何下载Windows 10系统的方法。1、首先下载一个小白重...
    99+
    2023-07-16
  • Linux下如何使用unzip命令解压文件
    这篇文章主要为大家展示了“Linux下如何使用unzip命令解压文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux下如何使用unzip命令解压文件”这篇文章吧。unzip命令是用于.z...
    99+
    2023-06-27
  • Linux系统中sz和rz命令详解(文件传输、上传、下载)
    rz和sz是Linux/Unix同Windows进行Zmodem文件传输的命令工具,都使用Zmodem文件传输协议。 rz: receive zmodem的缩写,运行该命令会弹出一个文件选择窗口,从本地选择文件上传到Linux服务器。sz:...
    99+
    2023-08-31
    linux 运维 服务器 sz rz
  • Linux系统下virtuoso数据库安装与使用详解
    最近在调研关联数据的一些东西,需要用到rdf数据库,所以接触了virtuoso数据库。安装的坑其实并不多,之前在windows 10上安过一次。这次在ubuntu 18.04上安装一下,其他的linux发行版安装的流程也...
    99+
    2022-06-04
    linux virtuoso 数据库安装与使用
  • 如何理解Linux系统中的虚拟文件系统
    这篇文章主要介绍“如何理解Linux系统中的虚拟文件系统”,在日常操作中,相信很多人在如何理解Linux系统中的虚拟文件系统问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Linux系统中的虚拟文件系统...
    99+
    2023-06-12
  • Linux下如何使用umount命令卸载文件系统
    这篇文章主要为大家展示了“Linux下如何使用umount命令卸载文件系统”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux下如何使用umount命令卸载文件系统”这篇文章吧。命令基本格式...
    99+
    2023-06-27
  • Linux下如何使用SSHFS挂载远程文件系统
    这篇文章主要介绍了Linux下如何使用SSHFS挂载远程文件系统,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SSHFS是一个通过SSH连接到服务器的网络文件系统客户端。SS...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作