首页 > 其他分享 >让nlohmann json支持std::wstring和嵌套结构的序列化与反序列化

让nlohmann json支持std::wstring和嵌套结构的序列化与反序列化

时间:2023-08-02 10:47:22浏览次数:41  
标签:std struct wstring nlohmann json 序列化

nlohmann json是一个star很高的C++ json解析库。

要让nlohmann json支持某个类型T,只要给这个类型T实现一个偏特化的struct adl_serializer<T>即可。adl_serializer是这个库里面针对泛型T预定义的适配器。

而嵌套结构,本身就支持的。使用预定义的宏NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE,可以免去自己针对每个类型T要实现其from_json/to_json函数。

 

下面是一个例子,适用于VC++。里面UTF-8和UTF-16的转换可以自行换成其他的实现方式。

#define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING 

#include <string>

#include <codecvt>
#include <locale>

#include <nlohmann/json.hpp>

using json = nlohmann::json;

namespace nlohmann {
    template <>
    struct adl_serializer<std::wstring> {
        static void to_json(json& j, const std::wstring& str) {
            std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
            j = converter.to_bytes(str);
        }

        static void from_json(const json& j, std::wstring& str) {
            std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
            str = converter.from_bytes(j.get<std::string>());
        }
    };
}

namespace ns {
    struct Address {
        std::wstring country;
        std::wstring province;
        std::wstring city;
    };
    NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Address, country, province, city)

    struct Person {
        std::wstring name;
        Address address;
        int age;
    };
    NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Person, name, address, age)

}

int main(int argc, char* argv[], char* envp)
{
    ns::Person p{ L"匿名", { L"中国", L"湖北", L"武汉" }, 60 };

    json j = p;
    const auto s = j.dump();

    auto p2 = j.template get<ns::Person>();

    return 0;
}

 

标签:std,struct,wstring,nlohmann,json,序列化
From: https://www.cnblogs.com/z16166/p/17599934.html

相关文章

  • PHP反序列化
    PHP反序列化序列化序列化的作用将对象或者数组转化为可存储/传输的字符串对象序列化O:4:"info":3:{s:4:"name";s:7:"iami233";s:6:"\x00*\x00age";s:2:"18";s:8:"\x00ctf\x00sex";s:7:"unknown";}//O:对象名的长度:"对象名"......
  • C# 反序列化报错 XML 文档(1, 2)中有错误:不应有 <xml xmlns=''>
    1.XmlSerializer症状用XmlSerializer进行xml反序列化的时候,程序报错:​不应有<xmlxmlns=''>。​​说明: ​执行当前Web请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 ​异常详细信息: ​System.InvalidOperatio......
  • Apache Shrio反序列化漏洞
    ApacheShiro是一个流行的Java安全框架,然而,它存在一个反序列化漏洞,即CVE-2017-5638。该漏洞允许攻击者通过构造恶意序列化数据,利用Shiro的序列化功能来执行任意代码,从而攻击Java应用程序的安全边界。 以下是ApacheShrio反序列化漏洞的介绍及复现过程:漏洞介绍CVE-2017-5638......
  • 【5.0】DRF之序列化组件
    【一】序列化组件介绍做序列化做反序列化在反序列化保存到数据库之前,做数据库校验【1】介绍DRF(DjangoRESTframework)是一个用于构建基于Django的WebAPI的强大框架。在DRF中,序列化组件是其中一个核心组件,用于在API请求和响应中处理数据的转换和验证。序列......
  • 【6.0】DRF之序列化组件高级
    【一】序列化高级之Source【补充】on_delete的参数详解models.CASCADE(级联删除):当删除与该字段关联的对象时,所有相关的对象将被级联删除。例如,如果一个出版社对象被删除了,与该出版社相关联的所有图书对象也会被删除。models.SET_DEFAULT:(设置为默认值):当删除与该字段关联的对......
  • 【四】DRF之序列化组件
    【一】序列化器-Serializer作用:序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型反序列化,完成数据校验功能【二】定义序列化器DjangoRESTframework......
  • 二次反序列化
    2023巅峰极客BabyURL题目给了jar包,反编译以后项目结构:在IndexController里有反序列化入口:@GetMapping({"/hack"})@ResponseBodypublicStringhack(@RequestParamStringpayload){ //将传进的参数进行base64解码byte[]bytes=Base64.getDecoder()......
  • Java反序列化Commons-Beanutils篇-CB链
    <1>环境介绍jdk:jdk8u65CB:commons-beanutils1.8.3pom.xml添加<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.8.3</version></dep......
  • CTFer成长记录——CTF之Misc专题·攻防世界—can_has_stdio?
    一、题目链接https://adworld.xctf.org.cn/challenges/list二、解法步骤  将附件拖入010:  发现是由很多符号组成的文件。这些符号是Brainfuck加密的编码,brainfuck是一种神奇的语言我只能说,找到解码地址:http://www.hiencode.com/brain.html  把文件内容全部拖入解码即......
  • log4j反序列化漏洞
    Vulhub-Docker-Composefileforvulnerabilityenvironment1、介绍名称:nginx解析漏洞编号:原理:应用:log4j版本:2、测试2.1靶场搭建2.2 ysoserial:JAVA反序列化POC生成工具(gitee.com)......