admin 发表于 2024-5-4 19:20:29

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 + _T("\"\n");
                        }
                        else
                        {
                                ss += GetBlankLen(iBlankLen + 1) + _T("\"") + values + _T("\",\n");
                        }
                }
                ss += GetBlankLen(iBlankLen) + _T("]");
        }
        return ss;
}

//对象组构造类
JsonObjectArr::~JsonObjectArr()
{
        for (int i = 0;i < values.size();i++)
        {
                delete values;
        }
        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->MakeJsonString(iBlankLen + 1);
                ss += _T(",");
        }
        ss += GetBlankLen(iBlankLen) + _T("]\n");
        return ss;
}


//属性组构造类
JsonObject::~JsonObject()
{
        for (int i = 0;i < values.size();i++)
        {
                delete values.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.second->MakeJsonString(iBlankLen + 1);
                ss += GetBlankLen(iBlankLen + 1);
                ss += _T("\"");
                ss += values.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;
        }
        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->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;
        }
        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->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]
查看完整版本: MFC环境下C++生产JSON串代码