MFC环境下C++生产JSON串代码

在MFC环境下生成JSON串并保存到文件,直接上代码:

头文件:JsonParse.h

#pragma once
#include <vector>



//Json对象基类
class JsonBase {
public:
	virtual CString MakeJsonString(int iBlankLen = 0) const = 0;
public:
	//功能:获取指定个数的空格
	//参数:iLen -  空格个数
	//返回值:空格字符串
	static CString GetBlankLen(int iLen);
};

//字符串构造类
class JsonString : public JsonBase {
private:
	CString value;
public:
	JsonString(const CString& str);
	CString MakeJsonString(int iBlankLen = 0) const override;
};

//浮点数构造类
class JsonDouble : public JsonBase {
private:
	double value;
public:
	JsonDouble(double num);
	CString MakeJsonString(int iBlankLen = 0) const override;
};

//整数构造类
class JsonNumber : public JsonBase {
private:
	int value;
public:
	JsonNumber(int num);
	CString MakeJsonString(int iBlankLen = 0) const override;
};

//字符串组构造类
class JsonStringArr : public JsonBase {
private:
	std::vector<CString> values;
public:
	JsonStringArr(std::vector<CString> val);
	JsonStringArr();
	CString MakeJsonString(int iBlankLen = 0) const override;
};

//对象组构造类
class JsonObjectArr : public JsonBase {
private:
	std::vector<JsonBase*> values;
private:
	~JsonObjectArr();
public:
	JsonObjectArr(std::vector<JsonBase*> val);
	CString MakeJsonString(int iBlankLen = 0) const override;
};

//属性组构造类
class JsonObject : public JsonBase {
private:
	std::vector<std::pair<CString, JsonBase*>> values;
public:
	~JsonObject();
public:
	void addValue(const CString& key, JsonBase* value);
	CString MakeJsonString(int iBlankLen = 0) const override;
};

//基础对象组构造类
class JsonArrObject : public JsonBase {
private:
	std::vector<JsonObject*> values;
public:
	~JsonArrObject();
public:
	void addValue(JsonObject* value);
	CString MakeJsonString(int iBlankLen = 0) const override;
};

//根组构造类
class JsonRootObject : public JsonBase {
private:
	std::vector<JsonArrObject*> values;
public:
	~JsonRootObject();
public:
	void addValue(JsonArrObject* value);
	CString MakeJsonString(int iBlankLen = 0) const override;
};

实现文件:JsonParse.cpp

#include "pch.h"
#include "JsonParse.h"

//功能:获取指定个数的空格
//参数:iLen -  空格个数
//返回值:空格字符串
CString JsonBase::GetBlankLen(int iLen)
{
	CString strBlank = _T("");
	for (int i = 0;i < iLen;i++)
	{
		strBlank += _T("  ");
	}
	return strBlank;
}

//字符串构造类
JsonString::JsonString(const CString& str)
{
	value = str;
}

CString JsonString::MakeJsonString(int iBlankLen) const
{
	return _T("\"") + value + _T("\"");
}

//浮点数构造类
JsonDouble::JsonDouble(double num) 
{
	value = num;
}
CString JsonDouble::MakeJsonString(int iBlankLen) const
{
	CString strVal = _T("");
	strVal.Format(_T("%.16f"), value);
	return strVal;
}

//整数构造类
JsonNumber::JsonNumber(int num)
{
	value = num;
}
CString JsonNumber::MakeJsonString(int iBlankLen) const
{
	CString strVal = _T("");
	strVal.Format(_T("%d"), value);
	return strVal;
}

//字符串组构造类
JsonStringArr::JsonStringArr(std::vector<CString> val)
{
	values = val;
}
JsonStringArr::JsonStringArr()
{ 
	values.clear();
}
CString JsonStringArr::MakeJsonString(int iBlankLen) const 
{
	CString ss = _T("");
	if (values.size() == 0)
	{
		ss += _T("[]");
	}
	else
	{
		ss += _T("\n") + GetBlankLen(iBlankLen) + _T("[\n");
		for (size_t i = 0; i < values.size(); ++i) {
			if (i == (values.size() - 1)) {
				ss += GetBlankLen(iBlankLen + 1) + _T("\"") + values[i] + _T("\"\n");
			}
			else
			{
				ss += GetBlankLen(iBlankLen + 1) + _T("\"") + values[i] + _T("\",\n");
			}
		}
		ss += GetBlankLen(iBlankLen) + _T("]");
	}
	return ss;
}

//对象组构造类
JsonObjectArr::~JsonObjectArr()
{
	for (int i = 0;i < values.size();i++)
	{
		delete values[i];
	}
	values.clear();
}

JsonObjectArr::JsonObjectArr(std::vector<JsonBase*> val)
{
	values = val;
}

CString JsonObjectArr::MakeJsonString(int iBlankLen) const 
{
	CString ss = _T("");
	ss += GetBlankLen(iBlankLen) + _T("[\n");
	for (size_t i = 0; i < values.size(); ++i) {
		if (i > 0) {
			ss += _T(",");
		}
		ss += GetBlankLen(1) + values[i]->MakeJsonString(iBlankLen + 1);
		ss += _T(",");
	}
	ss += GetBlankLen(iBlankLen) + _T("]\n");
	return ss;
}


//属性组构造类
JsonObject::~JsonObject()
{
	for (int i = 0;i < values.size();i++)
	{
		delete values[i].second;
	}
	values.clear();
}

void JsonObject::addValue(const CString& key, JsonBase* value)
{
	values.push_back({ key, value });
}

CString JsonObject::MakeJsonString(int iBlankLen) const 
{
	CString ss = _T("");
	ss += _T("\n") + GetBlankLen(iBlankLen) + _T("{\n");
	for (size_t i = 0; i < values.size(); ++i) {
		CString strvalue = values[i].second->MakeJsonString(iBlankLen + 1);
		ss += GetBlankLen(iBlankLen + 1);
		ss += _T("\"");
		ss += values[i].first;
		ss += _T("\":");
		ss += strvalue;
		if (i == (values.size() - 1)) {
			ss += _T("\n");
		}
		else
		{
			ss.TrimRight(_T("\n"));
			ss += _T(",\n");
		}
	}
	ss += GetBlankLen(iBlankLen) + _T("}");
	return ss;
}

//基础对象组构造类
JsonArrObject::~JsonArrObject()
{
	for (int i = 0;i < values.size();i++)
	{
		delete values[i];
	}
	values.clear();
}

void JsonArrObject::addValue(JsonObject* value)
{
	values.push_back(value);
}

CString JsonArrObject::MakeJsonString(int iBlankLen) const
{
	CString ss = _T("");
	for (int i = 0;i<values.size();i++)
	{
		CString strvalue = values[i]->MakeJsonString(iBlankLen + 1);
		ss += strvalue;
		if (i == (values.size() - 1)) {
			ss += _T("\n");
		}
		else
		{
			ss += _T(",\n");
		}
	}
	return ss;
}


//根组构造类
JsonRootObject::~JsonRootObject()
{
	for (int i = 0;i < values.size();i++)
	{
		delete values[i];
	}
	values.clear();
}

void JsonRootObject::addValue(JsonArrObject* value)
{
	values.push_back(value);
}

CString JsonRootObject::MakeJsonString(int iBlankLen) const 
{
	CString ss = _T("");
	for (int i = 0;i<values.size();i++)
	{
		if (iBlankLen > 0)
		{
			ss += _T("\n");
		}
		ss += GetBlankLen(iBlankLen) + _T("[");
		CString strvalue = values[i]->MakeJsonString(iBlankLen + 1);
		ss += GetBlankLen(iBlankLen) + strvalue;
		if (i == (values.size() - 1))
		{
			ss += GetBlankLen(iBlankLen) + _T("]\n");
		}
		else
		{
			ss += GetBlankLen(iBlankLen) + _T("],\n");
		}
	}
	return ss;
}


示例代码:

	// TODO: 在此添加控件通知处理程序代码
	JsonRootObject rootObject;
	{
		JsonArrObject* personTolArr = new JsonArrObject();
		{
			JsonObject* person = new JsonObject();
			person->addValue(_T("字符串"), new JsonString(_T("18402")));
			person->addValue(_T("浮点数"), new JsonDouble(850.36558));
			person->addValue(_T("整数"), new JsonNumber(850));
			JsonObject* personSon = new JsonObject();
			personSon->addValue(_T("属性1"), new JsonString(_T("属性值1")));
			personSon->addValue(_T("属性2"), new JsonString(_T("属性值2")));
			personSon->addValue(_T("属性3"), new JsonString(_T("属性值3")));
			personSon->addValue(_T("属性4"), new JsonString(_T("属性值4")));
			person->addValue(_T("属性组"), personSon);

			JsonRootObject* personRoot = new JsonRootObject();
			JsonArrObject* personArr = new JsonArrObject();
			{
				JsonObject* personItem = new JsonObject();
				personItem->addValue(_T("X"), new JsonDouble(5017847.33040384023));
				personItem->addValue(_T("Y"), new JsonDouble(4373415.5478087282));
				personItem->addValue(_T("Z"), new JsonDouble(0.0));
				personArr->addValue(personItem);
			}
			{
				JsonObject* personItem = new JsonObject();
				personItem->addValue(_T("X"), new JsonDouble(5017857.33040384023));
				personItem->addValue(_T("Y"), new JsonDouble(4373415.5478087282));
				personItem->addValue(_T("Z"), new JsonDouble(0.0));
				personArr->addValue(personItem);
			}
			{
				JsonObject* personItem = new JsonObject();
				personItem->addValue(_T("X"), new JsonDouble(5017867.33040384023));
				personItem->addValue(_T("Y"), new JsonDouble(4373415.5478087282));
				personItem->addValue(_T("Z"), new JsonDouble(0.0));
				personArr->addValue(personItem);
			}
			
			personRoot->addValue(personArr);
			person->addValue(_T("点组"), personRoot);
			personTolArr->addValue(person);
		}

		{
			JsonObject* person = new JsonObject();
			person->addValue(_T("字符串"), new JsonString(_T("18402")));
			person->addValue(_T("浮点数"), new JsonDouble(850.36558));
			person->addValue(_T("整数"), new JsonNumber(850));
			JsonObject* personSon = new JsonObject();
			personSon->addValue(_T("属性1"), new JsonString(_T("属性值1")));
			personSon->addValue(_T("属性2"), new JsonString(_T("属性值2")));
			personSon->addValue(_T("属性3"), new JsonString(_T("属性值3")));
			personSon->addValue(_T("属性4"), new JsonString(_T("属性值4")));
			person->addValue(_T("属性组"), personSon);

			JsonRootObject* personRoot = new JsonRootObject();
			JsonArrObject* personArr = new JsonArrObject();
			{
				JsonObject* personItem = new JsonObject();
				personItem->addValue(_T("X"), new JsonDouble(5017847.33040384023));
				personItem->addValue(_T("Y"), new JsonDouble(4373415.5478087282));
				personItem->addValue(_T("Z"), new JsonDouble(0.0));
				personArr->addValue(personItem);
			}
			{
				JsonObject* personItem = new JsonObject();
				personItem->addValue(_T("X"), new JsonDouble(5017857.33040384023));
				personItem->addValue(_T("Y"), new JsonDouble(4373415.5478087282));
				personItem->addValue(_T("Z"), new JsonDouble(0.0));
				personArr->addValue(personItem);
			}
			{
				JsonObject* personItem = new JsonObject();
				personItem->addValue(_T("X"), new JsonDouble(5017867.33040384023));
				personItem->addValue(_T("Y"), new JsonDouble(4373415.5478087282));
				personItem->addValue(_T("Z"), new JsonDouble(0.0));
				personArr->addValue(personItem);
			}

			personRoot->addValue(personArr);
			person->addValue(_T("点组"), personRoot);
			personTolArr->addValue(person);
		}
		//加入根
		rootObject.addValue(personTolArr);
	}

	//获取字符串
	CString jsonString = rootObject.MakeJsonString();

	//保存到本地文件
	char * old_locale = _strdup(setlocale(LC_ALL, NULL));
	setlocale(LC_ALL, "chs");//设定字符集
	CString filePath = _T("d:\\测试.json");
	CStdioFile fileRet;
	if (fileRet.Open(filePath, CStdioFile::modeWrite | CStdioFile::modeCreate | CStdioFile::typeText))
	{
		fileRet.WriteString(jsonString);
		fileRet.Close();
	}
	setlocale(LC_ALL, old_locale);//还原字符集
	free(old_locale);

特别要注意:在保存文件的时候,要设置字符集,不设置的话,中文无法保存。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码农709

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

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

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

打赏作者

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

抵扣说明:

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

余额充值