天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 24|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1591

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
    发表于 2024-5-4 19:20:29 | 显示全部楼层 |阅读模式
    在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);

     

     

     

     

    MFC环境下C++生产JSON串代码
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-5-19 05:51 , Processed in 0.061383 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表