本文主要是介绍2405C++,部分解析数格,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原文
如果一个很大
的数格串
,然后用户
只想解析
其中的一个字段
,一般需要遍历
所有串全部解析
所有字段,这样效率就很低
了.
如果可部分解析数格
字段,就可避免全部解析
了,从而获得更好的性能
.
iguana已增加了支持部分解析数格
的特征
,比如这样一个数格
对象:
struct some_test_t {int id1;std::string name;
};
REFLECTION(some_test_t, id1, name);
struct dummy_nest_t {int id;some_test_t t;
};
REFLECTION(dummy_nest_t, id, t);
把该对象
序化成数格串
后,我反序化
时,我只想反序化dummy_nest_t::id
该字段,其它的不需要
解析.代码
可这样写:
dummy_nest_t t{42, {43, "tom"}};std::string str;iguana::to_json(t, str); //序化到`数格`{dummy_nest_t t1;iguana::from_json<&dummy_nest_t::id>(t1, str); //部分反序化到`dummy_nest_t::id`CHECK(t1.id == 42);}
from_json
只会解析id
对应的那段串
,不会解析其它的串
,所以t1
中,只赋值id
.
如果要部分解析
嵌套对象some_test_t
中的名字字段
该怎么做呢?方法类似:
{some_test_t t1;iguana::from_json<&some_test_t::name, dummy_nest_t>(t1, str); //部分解析嵌套对象的`名字`字段CHECK(t1.name == "tom");
}
解析dummy_nest_t
嵌套对象字段时,需要填充第二个参数,即根对象的类型
,这里就是dummy_nest_t
.
之所以嵌套对象
需要填根对象的类型
,是为了安全性
,iguana
的部分解析
是有约束条件
的,条件就是不要有名字相同
的键
,否则,反序化
时无法区分到底应该解析
哪个键
.
填根对象类型时,iguana
会在编译期
检查所有字段,包括嵌套对象字段
是否有重名,如果重名
了就会给出一个编译期错误
.
除此外,如果填一个不属于根对象的字段
,iguana
也会在编译期
检查出来.
比如我部分解析
时填了个不属于dummy_nest_t
的字段:
some_test_t t1;iguana::from_json<&person::name, dummy_nest_t>(t1, str); //编译错误:成员不属于对象
如果存在重名字段
对象呢?
struct some_test_t1 {int id;std::string name;
};
REFLECTION(some_test_t1, id, name);
struct dummy_nest_t1 {int id;some_test_t1 t;
};
REFLECTION(dummy_nest_t1, id, t);
该dummy_nest_t1
的字段id
和嵌套对象some_test_t1
的字段id
,二者重名了,此时去部分解析
:
dummy_nest_t1 t1;
iguana::from_json<&dummy_nest_t1::id>(t1, str); //编译错误:字段名重复
因此该部分解析
是非常安全
的,因为它在编译期
检查安全性
.话说iguana
无论是易用性
还是各种很酷
的特性都是很不错的,为啥star
还这么少呢?
桃李不言,下自成蹊
,相信总有一天大家
会发现它是个多么好用
的库.
这篇关于2405C++,部分解析数格的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!