jsoncpp,rapidjson语法比较以及范例:probuf转化成json

{
  file: {
    key: "value",
    array: [
      {
        key00: "value00",
       key01: "value01"
      },
      {
        key10: "value10",
        key11: "value11"
      }
    ]
  }
}
#include <iostream>
#include <fstream>
#include <sstream>
#include "rapidjson/rapidjson.h"
#include "rapidjson/document.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/writer.h"
 
int main()
{
	//读取文件
	std::fstream fs("file.json");
	if(!fs)
		std::cout<<std::endl<<"file open failed"<<std::endl;
	std::stringstream ss;
	ss << fs.rdbuf();
	std::string str = ss.str();
 
	//解析
	rapidjson::Document doc;
	if (doc.Parse(str.c_str()).HasParseError())
		std::cout<<std::endl<<"parse failed"<<std::endl;
 
	rapidjson::Document::AllocatorType&allocator = doc.GetAllocator();   // 获取最初数据的分配器
	
	//增加元素
	doc["file"].AddMember("key2", "value2", allocator);
	
	//删除元素
	doc["file"].RemoveMember("key");
 
	//修改值
	doc["file"]["key2"].SetString("newValue");
 
	//数组操作//
 
	rapidjson::Value& array = doc["file"]["array"];//获取数组对象
	//添加数组对象
	rapidjson::Value item(rapidjson::kObjectType); //创建数组里面对象
	item.AddMember("key20", "value20", allocator);
	item.AddMember("key21", "value21", allocator);
	array.PushBack(item, allocator);
	
	//读取数组元素
	if(array[2].HasMember("key20"))//查找是否存在
		std::cout<<std::endl<<array[2]["key20"].GetString()<<std::endl;
 
	//删除数组最后一个元素
	array.PopBack();
 
	//输出
	rapidjson::StringBuffer buffer;
	rapidjson::Writer< rapidjson::StringBuffer > writer(buffer);
	doc.Accept(writer);
	std::string out = buffer.GetString();
	std::cout<<std::endl<<out<<std::endl;
}

jsconcpp

#include <iostream>
#include <fstream>
#include <jsoncpp/jsoncpp.h>
 
int main()
{
	//读取文件
	std::fstream fs("file.json");	
 
	if(!fs)
		std::cout<<std::endl<<"file open failed"<<std::endl;
	//解析
	Json::Reader reader;
	Json::Value root;
 
	if(!reader.parse(fs, root))
		std::cout<<std::endl<<"parse failed"<<std::endl;
 
	//修改元素值
	root["file"]["key"] = Json::Value("1");
 
	//删除元素
	root["file"].removeMember("key");
 
	//添加元素
	root["file"]["key2"] = Json::Value("value2");
	
	//数组操作
	Json::Value& array = root["file"]["array"];  //获取数组
	
	//删除,读取数组元素
	for(int i = 0; i < array.size(); i++)
	{
		if(array[i].isMember("key00"))
			array[i].removeMember("key00");
 
		if(!array[i].isMember("key01"))
				continue;
		std::string out = array[i]["key01"].asString();
		std::cout<<std::endl<<"key01:  "<<out<<std::endl;
	}
 
	//插入数组元素
	Json::Value item(Json::objectValue);
	item["key20"] = Json::Value("value20");
	item["key21"] = Json::Value("value21");
	
	array.append(item);
	
	//输出
	std::string out = root.toStyledString();
	std::cout<<std::endl<<out<<std::endl;
}
  • jsoncpp版本probuf转化成json
void FormatRepeatedField(Json::Value& value, const ::google::protobuf::Message& msg, const google::protobuf::FieldDescriptor *field, const ::google::protobuf::Reflection *reflection)
{
	if (NULL == field || NULL == reflection)
	{
		FormatToJson(value, msg);
	}
 
	for (int i = 0; i < reflection->FieldSize(msg, field); ++i)
	{
		Json::Value tmp_value;
		switch (field->type())
		{
		case FieldDescriptor::TYPE_MESSAGE:
			{
				const Message& tmp_msg = reflection->GetRepeatedMessage(msg, field, i);
				if (0 != tmp_msg.ByteSize())
				{
					FormatToJson(tmp_value, tmp_msg);
				}
			}
			break;
		case FieldDescriptor::TYPE_INT32:
			tmp_value = reflection->GetRepeatedInt32(msg, field, i);
			break;
		case FieldDescriptor::TYPE_UINT32:
			tmp_value = reflection->GetRepeatedUInt32(msg, field, i);
			break;
		case FieldDescriptor::TYPE_INT64:
			{
				static char int64str[25];
				memset(int64str, 0, sizeof(int64str));
				_snprintf(int64str, sizeof(int64str), "%lld", (long long)reflection->GetRepeatedInt64(msg, field, i));
				tmp_value = int64str;
			}
			break;
                case FieldDescriptor::TYPE_UINT64:
                        {
                                static char uint64str[25];
				memset(uint64str, 0, sizeof(uint64str));
				_snprintf(uint64str, sizeof(uint64str), "%llu", (unsigned long long)reflection->GetRepeatedUInt64(msg, field, i));
				tmp_value = uint64str;
                        }
                        break;
		case FieldDescriptor::TYPE_STRING:
		case FieldDescriptor::TYPE_BYTES:
			tmp_value = reflection->GetRepeatedString(msg, field, i);
			break;
		default:
			break;
		}
		value.append(tmp_value);
	}
}
void FormatToJson(Json::Value& value, const ::google::protobuf::Message& msg)
{
	const Descriptor* descriptor = msg.GetDescriptor();
	const Reflection* reflection = msg.GetReflection();
 
	const int count = descriptor->field_count();
 
	for (int i = 0; i < count; ++i)
	{
		const FieldDescriptor* field = descriptor->field(i);
 
		if (field->is_repeated())
		{
			if (reflection->FieldSize(msg, field) > 0)
			{
				FormatRepeatedField(value[field->name()], msg, field, reflection);
			}
			continue;
		}
 
		if (!reflection->HasField(msg, field))
		{
			continue;
		}
 
		switch (field->type())
		{
		case FieldDescriptor::TYPE_MESSAGE:
			{
				const Message& tmp_msg = reflection->GetMessage(msg, field);
				if (0 != tmp_msg.ByteSize())
				{
					FormatToJson(value[field->name()], tmp_msg);
				}
			}
			break;
		case FieldDescriptor::TYPE_INT32:
			value[field->name()] = reflection->GetInt32(msg, field);
			break;
		case FieldDescriptor::TYPE_UINT32:
			value[field->name()] = reflection->GetUInt32(msg, field);
			break;
		case FieldDescriptor::TYPE_INT64:
			{
				static char int64str[25];
				memset(int64str, 0, sizeof(int64str));
				_snprintf(int64str, sizeof(int64str), "%lld", (long long)reflection->GetInt64(msg, field));
				value[field->name()] = int64str;
			}
			break;
		case FieldDescriptor::TYPE_UINT64:
			{
				static char uint64str[25];
				memset(uint64str, 0, sizeof(uint64str));
				_snprintf(uint64str, sizeof(uint64str), "%llu", (unsigned long long)reflection->GetUInt64(msg, field));
				value[field->name()] = uint64str;
			}
			break;
		case FieldDescriptor::TYPE_STRING:
		case FieldDescriptor::TYPE_BYTES:
			{
				value[field->name()] = reflection->GetString(msg, field);
			}
			break;
		default:
			break;
		}
	}
}
  • rapidjson版本probuf转化成json

void FormatRepeatedField(rapidjson::Value& value, const ::google::protobuf::Message& msg,
						 const google::protobuf::FieldDescriptor *field,
						 const ::google::protobuf::Reflection *reflection, 
						 rapidjson::Document::AllocatorType& allocator)
{

	if (NULL == field || NULL == reflection)
	{
		FormatToJson(value, msg, allocator);
	}
    rapidjson::Value optionsValue (rapidjson::kArrayType);
	for (int i = 0; i < reflection->FieldSize(msg, field); ++i)
	{
		rapidjson::Value tmp_value;
		switch (field->type())
		{
		case FieldDescriptor::TYPE_MESSAGE:
			{
				const Message& tmp_msg = reflection->GetRepeatedMessage(msg, field, i);
				if (0 != tmp_msg.ByteSize())
				{
					rapidjson::Value root(rapidjson::kObjectType); // temp delete?
					FormatToJson(root, tmp_msg, allocator);
					//value.AddMember(rapidjson::StringRef(field->name().c_str()), root, allocator);
					tmp_value = root;
				}
			}
			break;
		case FieldDescriptor::TYPE_INT32:
			tmp_value = reflection->GetRepeatedInt32(msg, field, i);
			break;
		case FieldDescriptor::TYPE_UINT32:
			tmp_value = reflection->GetRepeatedUInt32(msg, field, i);
			break;
		case FieldDescriptor::TYPE_INT64:
			tmp_value = reflection->GetRepeatedInt64(msg, field, i);
			break;
        case FieldDescriptor::TYPE_UINT64:
			tmp_value = reflection->GetRepeatedUInt64(msg, field, i);
			break;
		case FieldDescriptor::TYPE_STRING:
		case FieldDescriptor::TYPE_BYTES:
			tmp_value = rapidjson::Value().SetString(reflection->GetRepeatedString(msg, field, i).c_str(),allocator).Move();
			break;
		default:
			break;
		}
		optionsValue.PushBack(tmp_value, allocator);
	}
	value = optionsValue;
}
void FormatToJson(rapidjson::Value& value, const ::google::protobuf::Message& msg,  rapidjson::Document::AllocatorType& allocator)
{

	const Descriptor* descriptor = msg.GetDescriptor();
	const Reflection* reflection = msg.GetReflection();
	const int count = descriptor->field_count();

	for (int i = 0; i < count; ++i)
	{
		const FieldDescriptor* field = descriptor->field(i);
 
		if (field->is_repeated())
		{
			if (reflection->FieldSize(msg, field) > 0)
			{
				rapidjson::Value root(rapidjson::kObjectType); // temp delete?
				FormatRepeatedField(root, msg, field, reflection, allocator);
				value.AddMember(rapidjson::StringRef(field->name().c_str()), root, allocator);
			}
			continue;
		}
 
		if (!reflection->HasField(msg, field))
		{
			continue;
		}
 	   
		switch (field->type())
		{
		case FieldDescriptor::TYPE_MESSAGE:
			{
				const Message& tmp_msg = reflection->GetMessage(msg, field);
				if (0 != tmp_msg.ByteSize())
				{
					rapidjson::Value root(rapidjson::kObjectType); // temp delete?
					FormatToJson(root, tmp_msg, allocator);
					value.AddMember(rapidjson::StringRef(field->name().c_str()), root, allocator);
				}
			}
			break;
		case FieldDescriptor::TYPE_INT32:

			value.AddMember(rapidjson::StringRef(field->name().c_str()), reflection->GetInt32(msg, field), allocator);
			break;
		case FieldDescriptor::TYPE_INT64:
			value.AddMember(rapidjson::StringRef(field->name().c_str()), reflection->GetInt64(msg, field), allocator);
			break;
		case FieldDescriptor::TYPE_UINT32:
			value.AddMember(rapidjson::StringRef(field->name().c_str()), reflection->GetUInt32(msg, field), allocator);
			break;
		case FieldDescriptor::TYPE_UINT64:
			value.AddMember(rapidjson::StringRef(field->name().c_str()), reflection->GetUInt64(msg, field), allocator);
		    break;
		case FieldDescriptor::TYPE_STRING:
		case FieldDescriptor::TYPE_BYTES:
			value.AddMember(rapidjson::StringRef(field->name().c_str()),
				rapidjson::Value().SetString(reflection->GetString(msg, field).c_str(),allocator).Move(),
				allocator);
			break;
		default:
			break;
		}
	}

}

用法

#define JSON_LOG(msg, x)  do {  rapidjson::Document d; \
	d.SetObject(); \
    rapidjson::Document::AllocatorType& c = d.GetAllocator(); \
	rapidjson::Value root(rapidjson::kObjectType); \
	FormatToJson(root, msg, c); \
	d.AddMember(rapidjson::StringRef("logrootlog"), root, c); \
	rapidjson::StringBuffer buffer; \
    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer); \
    d.Accept(writer); \
    std::string str = std::string(buffer.GetString());\
    STATISTICAL_LOG("%s\t%s", x, str.c_str()); } while(0) 

参考
https://blog.csdn.net/hudejun007/article/details/44852011

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值