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);

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: MFC是Microsoft Foundation Classes的简称,是用于开发Windows应用程序的C++类库。要解析JSON字符,可以使用MFC提供的一些功能。以下是一个简单的步骤指南: 1. 引入相关头文件: 在您的MFC应用程序中,需要包含`CString`、`CJsonReader`、`CJsonValue`等相关MFC头文件。可以根据您所使用的JSON解析库进行相应的包含。 2. 创建JSON解析器: 使用`CJsonReader`或其他适当的解析器创建一个JSON解析器对象。 3. 读取JSON字符: 使用`CJsonReader`的`Parse`或类似的方法来读取JSON字符。 4. 解析JSON: 根据您的需求,使用解析器提供的方法来解析JSON字符。例如,使用`Find`方法查找特定的键或索引,或使用`Get***`方法获取特定值的类型。 5. 处理解析结果: 根据您的解析结果执行相应的操作。您可以将解析到的值存储到变量中,或进行其他逻辑处理。 6. 释放资源: 在完成JSON解析后,记得释放相应的资源,例如销毁解析器对象等。 需要注意的是,MFC本身并没有提供专门用于JSON解析的功能,所以您需要选择一个适用的JSON解析库,并根据其具体的使用方法来进行解析操作。查阅相关文档和示例代码是很有帮助的。 ### 回答2: MFC是Microsoft Foundation Class的缩写,是一种用于开发Windows应用程序的框架。要解析JSON字符,我们可以使用MFC提供的一些类和函数。 首先,我们需要包含头文件"afx.h"和"json/json.h",后者是一个第三方库,用于解析JSON。 接下来,我们可以使用CString类来保存JSON字符,并通过Json::Reader类来解析它。Json::Value类则用于保存解析后的JSON数据。 示例代码如下: ```c++ #include <afx.h> #include "json/json.h" void ParseJSONString(const CString& jsonString) { Json::Reader reader; Json::Value root; // 解析JSON字符 if (!reader.parse(jsonString, root)) { // 解析失败 TRACE("Failed to parse JSON!\n"); return; } // 读取JSON数据 std::string name = root["name"].asString(); int age = root["age"].asInt(); bool isMale = root["isMale"].asBool(); // 输出结果 TRACE("name: %s\n", name.c_str()); TRACE("age: %d\n", age); TRACE("isMale: %s\n", isMale ? "true" : "false"); } int main() { CString jsonString = "{ \"name\":\"John\", \"age\":30, \"isMale\":true }"; ParseJSONString(jsonString); return 0; } ``` 以上代码将解析JSON字符"{ "name":"John", "age":30, "isMale":true }",并将相关数据输出到调试窗口。需要注意的是,示例中的JSON字符是使用双引号括起来的,而C++中的字符常量需要使用转义字符。 通过使用MFC和第三方JSON库,我们可以方便地解析JSON字符,并提取其中的数据用于后续的操作。 ### 回答3: MFC(Microsoft Foundation Classes)是微软提供的用于开发Windows应用程序的一套类库和框架。要使用MFC解析JSON字符,可以借助第三方库,如JsonCpp。 首先,需将JsonCpp添加到MFC项目中。可以从官方网站(https://github.com/open-source-parsers/jsoncpp)下载JsonCpp源码,并将其添加到项目中。 在MFC的源文件中,包含"json/json.h"头文件,该头文件定义了JsonCpp的API。然后,可以使用JsonCpp提供的API进行JSON字符的解析。 首先,将需要解析的JSON字符传递给JsonCpp的Json::Value对象,并使用Json::Reader对象来进行解析。以下是一个简单的例子: ```cpp #include "json/json.h" CString ParseJsonString(const CString& jsonString) { Json::Value root; Json::Reader reader; // 解析JSON字符 bool parsingSuccessful = reader.parse(jsonString.GetBuffer(), root); jsonString.ReleaseBuffer(); if (parsingSuccessful) { // 解析成功 // 从JSON对象中获取数据 CString name = root["name"].asCString(); int age = root["age"].asInt(); // 返回解析结果 return name + _T("的年龄是") + CString(age); } else { // 解析失败 return _T("解析JSON字符失败"); } } ``` 在上面的例子中,假设要解析的JSON字符包含了一个名字和年龄。首先,将JSON字符传递给Json::Reader的parse()函数进行解析。如果解析成功,则可以通过Json::Value对象获取相应的数据。这里将名字和年龄获取到,并通过CString拼接返回。 需要注意的是,这是一个简单的例子,实际应用中的JSON字符可能包含更复杂的结构和数据类型。根据具体的JSON字符结构,需要使用JsonCpp提供的API来获取相应的数据。 总之,通过使用第三方库JsonCpp,结合MFC的开发环境,可以方便地解析JSON字符并获取其中的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码农709

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

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

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

打赏作者

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

抵扣说明:

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

余额充值