c++ 使用 rapidjson 解析 json

环境搭建

在 git 上下载源码
之后将这个目录添加到项目的 “附加包含目录”:
在这里插入图片描述


代码

#include <iostream>
#include <Windows.h>
#include <vector> 
#include <atlbase.h> 
#include <algorithm> 
#include <clocale> 


#include "rapidjson/document.h"
#include "rapidjson/writer.h"

using namespace std;

/* https://blog.csdn.net/qq_27385759/article/details/79277434
	{
		"test_int": 100,
		"test_float": 100.9,
		"test_string": "asd",
		"test_float_array": [],
		"test_object": {
			"vec_key": [1, 2, 3,],
			"i_key": 789,
			"f_key": 111.3,
			"s_key": "qwe"
	}
}
*/
#define TEST_JSON "{\"test_int\": 100,\"test_float\" : 100.9,\"test_string\" : \"asd\",\"test_float_array\" : [] ,\"test_object\" : {\"vec_key\": [9, 3, 5, 7, 2, 0] ,\"i_key\" : 789,\"f_key\" : 111.3,\"s_key\" : \"qwe\"}}"

// 初始化
rapidjson::Document string2Json(string str)
{
    
    
	rapidjson::Document root;
	if (root.Parse(str.c_str()).HasParseError())
	{
    
    
		return NULL;
	}

	return root;
}

// 添加
void addJson(rapidjson::Document& doc)
{
    
    
	doc.AddMember("test_int", 100, doc.GetAllocator());
	doc.AddMember("test_float", 100.9, doc.GetAllocator());
	doc.AddMember("test_string", "asd", doc.GetAllocator());
	rapidjson::Value val_floatArr(rapidjson::kArrayType);
	doc.AddMember("test_float_array", val_floatArr, doc.GetAllocator());

	rapidjson::Value val_testObject(rapidjson::kObjectType);
	val_testObject.AddMember("i_key", 789, doc.GetAllocator());
	val_testObject.AddMember("f_key", 111.3, doc.GetAllocator());
	val_testObject.AddMember("s_key", "qwe", doc.GetAllocator());
	rapidjson::Value val_vecKey(rapidjson::kArrayType);
	val_vecKey.PushBack(1, doc.GetAllocator());
	val_vecKey.PushBack(2, doc.GetAllocator());
	val_vecKey.PushBack(3, doc.GetAllocator());
	val_testObject.AddMember("vec_key", val_vecKey, doc.GetAllocator());
	doc.AddMember("test_object", val_testObject, doc.GetAllocator());
}

void changeJson(rapidjson::Document& doc)
{
    
    
	doc["test_int"].SetInt(0);
	doc["test_float"].SetFloat(0);
	doc["test_string"].SetString("null");
	doc["test_object"]["i_key"].SetInt(0);
	doc["test_object"]["f_key"].SetFloat(0);
	doc["test_object"]["s_key"].SetString("null");
	rapidjson::Value& val_vecKey = doc["test_object"]["vec_key"];
	val_vecKey[0].SetInt(0);
	val_vecKey[1].SetInt(0);
	val_vecKey[2].SetInt(0);
}

// 删除
void deleteJson(rapidjson::Document& doc)
{
    
    
	doc["test_object"].RemoveAllMembers();			// RemoveAllMembers 只能删除 object 字段
	doc["test_object"].RemoveMember("i_key");		// RemoveMember 不能跨层删除	
}

// 输出
void displayJson(rapidjson::Document& doc)
{
    
    
	rapidjson::StringBuffer jsonBuffer;
	rapidjson::Writer<rapidjson::StringBuffer> writer(jsonBuffer);
	doc.Accept(writer);
	printf("%s\n\n", jsonBuffer.GetString());
}


int main()
{
    
    
	cout << "\n使用字符串初始化 json" << endl;
	rapidjson::Document docTest = string2Json(TEST_JSON);
	displayJson(docTest);

	cout << "\n添加 json" << endl;
	rapidjson::Document doc;
	doc.SetObject();
	addJson(doc);
	displayJson(doc);

	cout << "\n修改 json" << endl;
	changeJson(doc);
	displayJson(doc);

	cout << "\n删除 json" << endl;
	deleteJson(doc);
	displayJson(doc);
	

	
	cout << "\n\n\nfinished." << endl;
	getchar();
end:

	getchar();
	return 0;
}

效果图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Simon798/article/details/109523238