范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

低版本CJson反序列化方案

  现在的API接口普遍使用Json语法来描述,API的返回通常使用类似这样的结构:{   "code": 0,   "message": "",   "data": {...} }
  即所有API都有code和message属性以表示成功或错误,它和业务是无关的;其它属性/数据则在data中定义,它和业务是相关的。
  这种情况在C# / JAVA 中做反序列化时一般用泛型表示,如:class MyAPI {   public int x;   public int y; }  class ApiResponse {   public int code;   public string message;   public T data; }  ApiResponse resp = JsonConvert.DeserializeObject>(...);
  C++的处理方案由于RTTI(Runtime Type Information运行时类型信息)并不包含属性名等信息,无法通过反射找到类/结构的属性,因此无法实现C# / JAVA那种看起来比较优雅的写法。
  github上解决这个问题的项目很多,但它们许多要求使用c++17或20以上的版本,由于我的项目限制只能使用c++14,因此我只看c++11或14的解决方案。
  这些项目的解决方案大体有两类:
  1.提供更友好的读写属性的方法,比如通过["..."]["..."]层层嵌套,让用户更容易读写属性,但是它并没有完成在对象/结构实体上的映射和赋值,相当于这个工作得用户来做,因此它更像是只提供了一些序列化/反序列化的辅助方法,而不是完整的json和对象转化的解决方案,标星超过3万的https://github.com/nlohmann/json就是这种情况;
  2.允许用户用通常的写法去定义类/结构,再通过宏去标识需要和json做映射的属性,完成类似其他语言的反射机制,当然它是在编译期实现属性定位而不是其他语言的运行期。
  方案2在使用成本上相较方案1要小很多,也更符合主流方案的习惯。我看了几个项目,最后选了json_struct(https://github.com/jorgen/json_struct),它的解决方案是:
  对于一个json串:{   "One" : 1,   "Two" : "two",   "Three" : 3.333 }
  定义一个类:struct JsonObject {   int One;   std::string Two;   double Three;      JS_OBJ(One, Two, Three); };
  JS_OBJ是用于解决反射问题的宏,也可以定义在类外面:struct JsonObject {   int One;   std::string Two;   double Three; }; JS_OBJ_EXT(JsonObject, One, Two, Three);
  反序列化:JS::ParseContext context(json_data); JsonObject obj; context.parseTo(obj);
  由此可见,除了所有方案都要写的类/结构定义之外,为反序列化要做的也就只写几行代码而已,相对方案1是简单了很多的,与C# / JAVA的解决方案相当。
  回到最初的需求:{   "code": 0,   "message": "",   "data": {...} }
  这个结构是嵌套的,无法使用类似于C# / JAVA 的写法:class MyAPI {   public int x;   public int y; }  class ApiResponse {   public int code;   public string message;   public T data; }  ApiResponse resp = JsonConvert.DeserializeObject>(...);
  json_struct的文档和examples中也没有提供明确的案例可以参考。
  我试了一下,可以这样来定义:struct ApiResponse {   int code;   string message;    JS_OBJ(code, message); }  struct MyApiData {   int x;   int y;    JS_OBJ(x, y); }  struct MyAPI : public ApiResponse {   MyApiData data;    JS_OBJ(data); }
  然后这样解析就可以了:JS::ParseContext context(...); MyAPI myApi; context.parseTo(myApi);
  上述写法,相较C# / JAVA,C# / JAVA是用ApiResponse来包MyAPI(泛型传参),C++是用MyAPI来包ApiResponse(子类继承),并将子属性data从MyAPI拆出来,相当于多定义了一级,从语法上似乎稍微累赘一点,但整体结构还是清晰直观的。

世界野生动植物日这些关于野生动物的小知识,等你来签收查看2023年3月3日将迎来第十个世界野生动植物日全球的主题为野生动植物保护伙伴关系中国宣传主题为广泛发动社会力量,共同推进物种保护走进秦岭行之所至皆是青葱翠绿这里有常绿阔叶林还有珍稀城步桃花盛开喜迎客红网时刻新闻3月6日讯(通讯员刘婕王蕾婷)春意融融万物苏,又到桃花盛开时。在城步桃林村一朵朵桃花竞相开放,把村庄装扮的格外迷人。和煦的阳光下,道路两旁上千株桃花在枝头肆意绽放,一簇2023年春节四川云南自驾42天(二)蜀道难午后北上广元,直接来到千佛崖。一定要听讲解,现场扫微信二维码就可以。石窟始凿于北魏晚期,兴盛于唐朝,止于清代,历经千年,从而形成一座佛崖长388米,高45米,造像950余龛,700传承雷锋精神,争做文明先锋,齐鲁志愿者走进景区服务百姓记者王丽为了传承弘扬雷锋精神和志愿服务精神,3月3日,济南公交集团干线公司六队积极组织高星驾驶员志愿服务队党员志愿服务队,深入景区重点路口公交站牌,开展多种形式的志愿服务活动,充分魅力女性,雅致巾帼河口社区组织召开三八女神节交流座谈活动春回大地暖,情系半边天,在这春暖花开的季节,迎来了全体女性同胞的共同节日三八妇女节。为了更好的展现河口社区妇女的幸福感,以充满活力的精神面貌树立社区妇女的形象,河口社区组织妇女同胞全国人大代表德力西胡成中加大力度支持精密制造国产替代两会时间充分发挥多层次资本市场作用,引导国家及民间资本积极流入以高端机床为代表的高端基础制造业图为全国人大代表德力西集团董事局主席胡成中。投资时报记者李浥尘近几年,单边主义与贸易保护主义抬女性被教育耽误了最佳生育期!女性被教育耽误了最佳生育期?那女性被生育耽误了什么?耽误了最佳学习期,最佳事业上升期有委员提议将六三三学制改成五二三,因为传统的学制周期太长,女性读完高中已经快19岁,大学读完接近解读2023年政府报告,重新定位房地产,房价上涨已经成为历史今年的政府工作报告,对于我们现在的房地产行业进行了重新定位,也是今年制订所有房地产政策的基础,更是对整体经济形势确定了明确的方向。下面重点解读政府报告中,提及房地产的相关重要措施!一旦出现倒锤头线止跌形态,只要次日反包,坐等拉升足矣!在市场连续阴跌时,长沙五一大道的一位李姓股民火了,他居然能够在这2个月的时间里,达到40以上的收益率,让很多股友羡慕不已!他的方法非常简单,就是将当天首板涨停的个股加入自选,然后每格力电器累计派现超千亿分红率近50货币资金1528亿欲债务融资200亿补流长江商报消息长江商报记者魏度一向不差钱且频频豪气分红累计超千亿的格力电器(000651。SZ)再融资获准。3月2日晚间,格力电器公告,近期,中国银行间市场交易商协会(以下称交易商协2月中国大宗商品指数升至近5个月来最高北京日报客户端记者陈雪柠3月5日,中国物流与采购联合会发布数据显示,2023年2月份,中国大宗商品指数(CBMI)为102。8,升至近5个月以来的最高,较上月回升2。4个百分点,表
人类智慧从何而来?科学家的新研究发现揭示人类文明诞生的真相做了几期关于人类的视频之后,夫人便提出了一个非常费老公的问题生活在地球上的众多动物中,为什么单单只有人类,进化出了智慧以及制造工具的能力?而其它动物依然还是野兽?百科上说晚期智人是为什么科学家要舍近求远,不发射探测器登陆金星,反而探索火星?金星位于地球轨道内侧,火星位于地球轨道外侧。金星距离地球最近时为4200万公里,火星距离地球最近时为5500万公里。从距离上来说,金星离地球更近。可近些年,许多航天大国都热衷于探索行星杀手可能会在太阳的掩护下攻击地球近日很多人被一颗小行星刷了屏。这颗宽约1500米的小行星名为2022AP7,被认为是近8年来发现的可能会对地球有威胁的小行星中最大的一颗。2022AP7被发现时,它正在穿越太阳另一双11换手机,看这篇就够了哈喽大家好,我是科技与狼活。一年一度的双11要到了,又到了许多小伙伴买手机的时间呢?今天我们就来聊一聊,有哪些值得入手的好机。(以下全部为个人观点,不喜勿喷)关注新机之前,请先关注舒摩斯Ola(欧拉)电动牙刷评测高颜值,让你的牙齿白白净净当你还在用手动牙刷的时候,我已经用上电动牙刷了,你就说气不气,说到电动牙刷肯定会有很多人说,电动牙刷贵,刷的不干净,那你就大错特错了,现在的电动牙刷已经不在是从前的那种电动牙刷了,4K120Hz屏8000Hz高频PMW调光,跌至3369元,海信65英寸售价亲民双十一到了,很多网友在此期间买家电,都能获得不小的优惠,有的用户想要买电视,现在的电视也有很多品牌,小米海信华为康佳和TCL等等,国产电信也非常热销,小米电视性价比高,不过都是TC2022智能投影产品创新指南发榜有个未上榜品牌成了幕后赢家近日,以融绘光影新视界为主题的2022第二届CSPC中国智能投影产业高峰论坛在北京成功召开。在这一次会议中,更为明确透视出智能投影仪已成为消费电子中最耀眼的细分品类,智能投影产品已2022年双十一12400F和5600X选哪个合适?实测对比虽然13代酷睿和锐龙7000上市了,但是12400F和5600X依旧是今年双十一性价比最高最主流的选择,问我的人也挺多,每次配置单里写12400就有人问我5600,写5600就有人看不见主机的电脑火了,我们和用它的人聊了聊在刚刚开启的云栖大会上,阿里云推出了一款与MacbookAirM1一样重,3D渲染等续航却比M2芯片笔记本还多100的产品无影笔记本,不一样的是,这款设备本地并没有主CPUGPU硬高销量没有秘密,只有实力,发布一年后才入阿尔法蛋T10依然很香为人父母要把自己练就金刚不坏之身,还要无所不能。单单选择儿童品牌上就要做不少功课,好在市面上不同品类销量前几比较固定,看似从众的选择,实际也是家长们的认同,产品经得住考验。最近新入诺基亚发布2780Flip翻盖机骁龙215处理器1450mAh可拆卸电池近日,诺基亚推出了诺基亚2780Flip翻盖机,没有配备触摸屏,但是有T9键盘。诺基亚2780Flip配备了一块2。7英寸的TFT主显示屏,以及一块1。77英寸的副屏,背部还拥有一