欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++--简单字符串数据--json序列化和反序列化--map对象转json--jsoncpp

程序员文章站 2022-06-16 10:26:13
...

  在C++编码中,需要根据参数进行数据处理时,经常遇到的一个问题就是需要将关键的内存类属性数据转为文件保存,方便下次加载使用。使用jsoncpp开源库,下文展示一个范例代码,源代码如下所示:

#include <sstream>
#include <fstream>
#include <stdio.h>
#include <string>
#include <iostream>

//加载文档
void ACustomDocumentInfo::LoadDocumentParaInfo(std::string filename)
{
	// 打开文件
	std::ifstream ifs(filename, std::ios::binary);
	if (!ifs.good())
	{
		return;
	}

	//读取信息
	Json::Value root;
	Json::Reader reader;
	if (!reader.parse(ifs, root)) {
		return;
	}

	//转换信息
	int sz = root.size();
	for (int i = 0; i < sz; ++i) 
	{
		Json::Value jObject=root[i];
		std::string layer_type=jObject["layer_type"].asString();
		if (layer_type=="normal_label_size")
		{
			//读取关键数据
			std::string layer_name=jObject["layer_name"].asString();
			Json::Value property=jObject["obj_property"];
			ANormalLabelSize* pANormalLabelSize=new ANormalLabelSize;
			pANormalLabelSize->SetContentByJson(property.toStyledString());

			m_ANormalLabelSizeMap[layer_name]=pANormalLabelSize;
		}
	}
}

void ACustomDocumentInfo::SaveDocumentParaInfo(std::string filename)
{
	//打开文件
	std::ofstream ofs(filename, std::ios::binary | std::ios_base::out | std::ios_base::trunc);
	if (!ofs.good())
	{
		return;
	}

	//将map信息转为json
	Json::Value root;
	std::map<std::string,ANormalLabelSize*>::iterator it=m_ANormalLabelSizeMap.begin();
	for (;it!=m_ANormalLabelSizeMap.end();it++)
	{
		//保存图层名
		Json::Value jObject;
		jObject["layer_name"]=it->first;
		std::string json_str=it->second->GetContentByJson();

		//常规尺寸标注
		jObject["layer_type"]="normal_label_size";

		//保存正常尺寸数据
		Json::Reader reader;
		Json::Value value;
		if (reader.parse(json_str, value))
		{
			jObject["obj_property"]=value;
		}

		root.append(jObject);
	}

	ofs<<root.toStyledString();
}

static std::string map2jsonstr(const std::map<std::string,std::string>& map_info)
{
	Json::Value jObject;
	for (std::map<std::string, std::string>::const_iterator iter = map_info.begin( ); iter != map_info.end( ); ++iter) 
	{
		jObject[iter->first] = iter->second;
	}
	return jObject.toStyledString();
}

static std::string itoa_self(int i)
{
	std::stringstream ss;
	ss << i;
	return ss.str();
}

//解析json字符串转为map数据
static std::map<std::string,std::string> jsonstr2map(const std::string& json)
{
	Json::Reader reader;
	Json::Value value;
	std::map<std::string, std::string> maps;

	if (json.length() > 0) 
	{
		if (reader.parse(json, value)) 
		{
			Json::Value::Members members = value.getMemberNames();
			for (Json::Value::Members::iterator it = members.begin(); it != members.end(); it++) 
			{  
				Json::ValueType vt = value[*it].type();
				switch (vt)
				{
				case Json::stringValue:
					{
						maps.insert(std::pair<std::string, std::string>(*it, value[*it].asString()));
						break;
					}
				case Json::intValue:
					{
						int intTmp = value[*it].asInt();
						maps.insert(std::pair<std::string, std::string>(*it, itoa_self(intTmp)));
						break;
					}
				case Json::arrayValue:
					{
						std::string strid;
						for (unsigned int i = 0; i < value[*it].size(); i++)
						{
							strid +=value[*it][i].asString();
							strid +=",";
						}
						if(!strid.empty())
						{
							strid = strid.substr(0,strid.size()-1);
						}
						maps.insert(std::pair<std::string, std::string>(*it, strid));
						break;
					}
				default:
					{
						break;
					}
				}//end switch
			}//end for
		}//end if
	}

	return maps;
}

//加载数据
void ANormalLabelSize::SetContentByJson(std::string& data)
{
	m_Propertys=jsonstr2map(data);
}

//保存数据
std::string ANormalLabelSize::GetContentByJson()
{
	return map2jsonstr(m_Propertys);
}

  合理的代码可以有效的提高工作效率,减少重复劳动。


  欢迎光临知了软件开发网络平台,本公司定制开发各类软件,主要方向为桌面专业软件开发和插件定制开发,桌面软件主要包括文字图形识别类软件,信息管理类软件,3D打印类软件,视频类软件以及其它涉及专业的各类图形图像处理软件。插件包含AE插件,AI插件,PS插件,PDF插件,3DMAX插件以及Word,Excel等Office插件开发。详情请咨询,微信QQ:312117271,手机:18928899728,邮箱: [email protected]
公司网址:http://www.zhiliaos.com