C++构造和解析Json

概述

JSON是一种轻量级的数据交互格式,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率,实际项目中经常用到,相比xml有很多优点,问问度娘,优点一箩筐。

第三方库

json解析选用jsoncpp作为第三方库,jsoncpp使用广泛,c++开发首选。

jsoncpp目前已经托管到了github上,地址:https://github.com/open-source-parsers/jsoncpp

使用

使用c++进行构造json和解析json,选用vs2010作为IDE。工程中使用jsoncpp的源码进行编译,没有使用jsoncpp的库,为方便大家使用把dll和lib库也放到了我的工程jsoncpplib文件夹下,有需要的可以直接引用库。

待解析的json数据格式如下图:

/********************************************************
Copyright (C), 2016-2017,
FileName: 	main
Author: 	woniu201
Email: 		
Created: 	2017/09/06
Description:use jsoncpp src , not use dll, but i also provide dll and lib.
********************************************************/

#include "stdio.h"
#include <string>
#include "jsoncpp/json.h"

using namespace std;

/************************************
@ Brief:		read file
@ Author:		woniu201 
@ Created: 		2017/09/06
@ Return:		file data  
************************************/
char *getfileAll(char *fname)
{
	FILE *fp;
	char *str;
	char txt[1000];
	int filesize;
	if ((fp=fopen(fname,"r"))==NULL){
		printf("open file %s fail \n",fname);
		return NULL;
	}

	fseek(fp,0,SEEK_END); 

	filesize = ftell(fp);
	str=(char *)malloc(filesize);
	str[0]=0;

	rewind(fp);
	while((fgets(txt,1000,fp))!=NULL){
		strcat(str,txt);
	}
	fclose(fp);
	return str;
}

/************************************
@ Brief:		write file
@ Author:		woniu201 
@ Created: 		2017/09/06
@ Return:		    
************************************/
int writefileAll(char* fname,const char* data)
{
	FILE *fp;
	if ((fp=fopen(fname, "w")) == NULL)
	{
		printf("open file %s fail \n", fname);
		return 1;
	}
	
	fprintf(fp, "%s", data);
	fclose(fp);
	
	return 0;
}

/************************************
@ Brief:		parse json data
@ Author:		woniu201 
@ Created: 		2017/09/06
@ Return:		    
************************************/
int parseJSON(const char* jsonstr)
{
	Json::Reader reader;
	Json::Value  resp;

	if (!reader.parse(jsonstr, resp, false))
	{
		printf("bad json format!\n");
		return 1;
	}
	int result = resp["Result"].asInt();
	string resultMessage = resp["ResultMessage"].asString();
	printf("Result=%d; ResultMessage=%s\n", result, resultMessage.c_str());

	Json::Value & resultValue = resp["ResultValue"];
	for (int i=0; i<resultValue.size(); i++)
	{
		Json::Value subJson = resultValue[i];
		string cpuRatio = subJson["cpuRatio"].asString();
		string serverIp = subJson["serverIp"].asString();
		string conNum = subJson["conNum"].asString();
		string websocketPort = subJson["websocketPort"].asString();
		string mqttPort = subJson["mqttPort"].asString();
		string ts = subJson["TS"].asString();

		printf("cpuRatio=%s; serverIp=%s; conNum=%s; websocketPort=%s; mqttPort=%s; ts=%s\n",cpuRatio.c_str(), serverIp.c_str(),
			conNum.c_str(), websocketPort.c_str(), mqttPort.c_str(), ts.c_str());
	}
	return 0;
}

/************************************
@ Brief:		create json data
@ Author:		woniu201 
@ Created: 		2017/09/06
@ Return:		    
************************************/
int createJSON()
{
	Json::Value req;
	req["Result"] = 1;
	req["ResultMessage"] = "200";

	Json::Value	object1;
	object1["cpuRatio"] = "4.04";
	object1["serverIp"] = "42.159.116.104";
	object1["conNum"] = "1";
	object1["websocketPort"] = "0";
	object1["mqttPort"] = "8883";
	object1["TS"] = "1504665880572";
	Json::Value	object2;
	object2["cpuRatio"] = "2.04";
	object2["serverIp"] = "42.159.122.251";
	object2["conNum"] = "2";
	object2["websocketPort"] = "0";
	object2["mqttPort"] = "8883";
	object2["TS"] = "1504665896981";

	Json::Value jarray;
	jarray.append(object1);
	jarray.append(object2);

	req["ResultValue"] = jarray;

	Json::FastWriter writer;
	string jsonstr = writer.write(req);

	printf("%s\n", jsonstr.c_str());

	writefileAll("createJson.json", jsonstr.c_str());
	return 0;
}

int main()
{
	char* json = getfileAll("parseJson.json");
	parseJSON(json);
	printf("===============================\n");
	createJSON();

	getchar();
	return 1;
}

源码下载地址:点击下载

没有下载积分的,可以关注下面公众号,回复"104"获取源码

欢迎加群交流:C/C++开发交流

### 关于C++中的JSON库 在C++开发中,处理JSON数据是一个常见的需求。以下是几个常用的C++ JSON库及其特点: #### 1. **json_struct** `json_struct` 是一个单头文件的C++库,专注于将JSON直接解析C++结构体以及反向操作[^1]。它提供了简单易用的功能来实现JSONC++对象之间的转换。 #### 2. **simdjson** `simdjson` 是一种高性能的JSON解析器,利用SIMD指令集微并行算法显著提升了解析速度。相比其他流行的生产级JSON解析器(如RapidJSON),它可以达到4倍以上的性能提升[^3]。其主要特性包括: - 高效:能够以超过6 GB/s的速度最小化JSON。 - 完整验证:支持完整的JSON语法UTF-8校验。 - 自动适配:运行时自动选择适合当前CPU架构的最佳解析器版本。 #### 3. **nlohmann/json (JSON for Modern C++)** 这是一个广泛使用的现代C++ JSON库,提供简洁直观的操作接口。它的设计目标是让开发者可以像使用原生C++容器一样轻松地处理JSON数据[^2]。该库具有以下优势: - 支持多种输入/输出方式,包括字符串、流等。 - 提供丰富的查询功能,便于访问复杂的嵌套结构。 - 可扩展性强,允许自定义序列化逻辑。 #### 示例代码展示如何使用 nlohmann/json 进行基本读写操作 ```cpp #include <iostream> #include <nlohmann/json.hpp> using json = nlohmann::json; int main() { // 创建一个简单的JSON对象 json j; j["name"] = "John Doe"; j["age"] = 30; std::cout << j.dump(4) << std::endl; // 输出格式化的JSON // 解析来自字符串的JSON const auto input_str = R"({"name":"Jane Smith","age":25})"; json parsed_j = json::parse(input_str); std::string name = parsed_j["name"]; int age = parsed_j["age"]; std::cout << "Name: " << name << ", Age: " << age << std::endl; } ``` 上述例子展示了创建JSON对象并将之转为字符串表示形式的过程;同时也演示了从字符串加载JSON内容并提取字段的方法。 ### 总结 对于不同的应用场景可以选择合适的工具。如果追求极致效率,则考虑 `simdjson`; 若更看重便捷性功能性则推荐采用 `nlohmann/json`.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农code之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值