首页 > 其他分享 >自定义序列化

自定义序列化

时间:2024-11-14 14:56:36浏览次数:1  
标签:std 自定义 ArchiveReq auto req key 序列化 memberPtr

#ifndef AI_PACS_JSONTOSTRUCT_H
#define AI_PACS_JSONTOSTRUCT_H


#include <iostream>
#include <string>
#include <unordered_map>
#include <variant>
#include <vector>
#include <nlohmann/json.hpp>
#include <stdexcept>


using json = nlohmann::json;

class JsonToStruct {
public:
    template <typename T>
    static void getMember(T& req, typename T::MemberPtr member,json& nameField ) {
        std::visit([&req, &nameField](auto&& memberPtr) {
                nameField = req.*memberPtr;
        }, member);
    }

    template<typename T>
    static void setMember(T &req, typename T::MemberPtr ptr, auto &&value) {
        std::visit([&req, value = std::forward<decltype(value)>(value)](auto memberPtr) {
            req.*memberPtr = value;
        }, ptr);
    }

    template<typename T>
    static T fromJson(const json &j) {
        T req;
        auto fieldMap = T::getFieldMap();
        for (const auto &[key, memberPtr]: fieldMap) {
            try {
                if (j.contains(key)) {
                    setMember(req, memberPtr, j[key]);
                } else {
                    throw std::runtime_error("Missing required field: " + key);
                }
            } catch (const std::exception &e) {
                std::cerr << "Error: " << e.what() << std::endl;
                throw;
            }
        }
        return req;
    }

    template<typename T>
    static json toJson(const T &req) {
        auto  object = json::object();
        auto fieldMap = T::getFieldMap();
        for (const auto &[key, memberPtr]: fieldMap) {
            try {
                getMember(req,memberPtr,object[key]);
            } catch (const std::exception &e) {
                throw std::runtime_error("Error serializing field '" + key + "': " +e.what());
            }
        }
        return object;
    }
};


#endif //AI_PACS_JSONTOSTRUCT_H

结构体

truct ArchiveReq {
    std::string requestId;
    std::string hospCode;
    std::string studyUID;
    std::string notifyUrl;
    std::string fileType;
    std::vector<std::string> files;


    using MemberPtr = std::variant<std::string ArchiveReq::*, std::vector<std::string> ArchiveReq::*>;

    static std::unordered_map<std::string, MemberPtr> getFieldMap() {
        return {
                {"requestId", &ArchiveReq::requestId},
                {"hospCode",  &ArchiveReq::hospCode},
                {"studyUID",  &ArchiveReq::studyUID},
                {"notifyUrl", &ArchiveReq::notifyUrl},
                {"fileType",  &ArchiveReq::fileType},
                {"files",     &ArchiveReq::files}
        };
    }

};

标签:std,自定义,ArchiveReq,auto,req,key,序列化,memberPtr
From: https://www.cnblogs.com/guanchaoguo/p/18545991

相关文章

  • 在Go中使用自定义类型与Swagger集成
    在Go语言中,自定义类型可以帮助我们更好地组织代码和增强可读性。在本篇博客中,我们将探讨如何创建一个自定义类型,并将其与Swagger文档集成,以便在API中正确序列化和展示。1.创建自定义类型首先,我们定义一个名为 RechargeType 的自定义类型。这个类型将用于表示不同的充值方式。......
  • R语言data.table导入数据实战:data.table使用自定义函数及Reduce函数实现一次性性多表
    R语言data.table导入数据实战:data.table使用自定义函数及Reduce函数实现一次性性多表连接、data.table使用自定义函数及Reduce函数实现一次性性多表连接目录R语言data.table导入数据实战:data.table使用自定义函数及Reduce函数实现一次性性多表连接#data.table是什么?#dat......
  • 代码审计:TP5 框架及无框架变量覆盖与反序列化
    目录代码审计:TP5框架及无框架变量覆盖与反序列化一、什么是TP5框架及无框架变量覆盖与反序列化审计二、原理(一)变量覆盖原理(二)变量覆盖与文件包含漏洞结合原理(三)反序列化原理(文中虽未详细提及,但为完整理解可补充)三、步骤与代码示例(一)准备工作(二)审计步骤与代码分析......
  • 永宏BI 自定义绘图(环状图)
    结果样式:绑定数据:自定义JS代码:点击查看代码option={tooltip:{trigger:'item',formatter:'{a}<br/>{b}:{c}({d}%)'},series:[{type:'pie',radius:['50%......
  • SpringBoot自定义Starter指南
    SpringBoot的Starter自动配置机制极大地简化了依赖管理和应用配置,使得开发者可以以最少的配置快速启动和运行Spring应用。有时,标准的Starter可能无法满足特定需求,这时我们可以创建自定义Starter来扩展SpringBoot的功能。什么是SpringBootStarterSpringBootStarter是一......
  • 【Java】自定义注解的使用
    什么是注解java中的,注解分为两种,元注解和自定义注解,类似于公理和定理的关系。我们常用一些注解:@Autowired、@Override等都是自定义注解。在JAVA中如何实现自定义注解?@interface关键字我们想定义一个自己的注解需要使用@interface来定义。//元注解@Target(ElementType.ME......
  • 一个C#winform编写的2D数据曲线显示控件,三个Y轴,自定义曲线图表控件,电压电流实时数据曲
    一个C#winform编写的2D数据曲线显示控件,三个Y轴,自定义曲线图表控件,电压电流实时数据曲线,电压电流轨迹曲线实时刷新,点击显示此处数据(附下载链接)调用该控件案例截图如下所示:点我下载此资源》》》》》》》》......
  • kafka(启动集群,使用spring方法,自定义配置)
    ApacheKafka是一个开源的分布式流处理平台,最初由LinkedIn开发,后来成为Apache项目。Kafka主要用于高吞吐量、低延迟的实时数据流处理,常用于日志收集、实时分析、消息传递等场景。以下是关于Kafka的详细讲解:一、理论知识1.Kafka的基本概念Kafka是一个分布式的......
  • 2024-11-13 uniapp自定义全局弹窗并可以通过uni来调用【转载】
    新建三个文件: dialog.js:exportdefault{/*链接处理*/getLink(params){leturl="/components/dialog/index";if(params){letparamStr="";for(letnameinparams){param......
  • 窗口辅助管理工具:Magnet MacOS电脑分屏软件 可自定义分割屏幕
    Magnet是一款功能强大的窗口辅助管理工具软件,专为Mac用户设计。它支持用户通过简单的拖放操作,将窗口快速捕捉到特定位置和大小,支持窗口分割和自定义布局。同时,Magnet提供了丰富的快捷键操作,提高了窗口管理的效率。此外,它还支持多显示器窗口管理和自定义布局模板,充分利用大屏幕优......