原文
如果一个很大的数格串,然后用户只想解析其中的一个字段,一般需要遍历所有串全部解析所有字段,这样效率就很低了.
如果可部分解析数格字段,就可避免全部解析了,从而获得更好的性能.
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还这么少呢?
 桃李不言,下自成蹊,相信总有一天大家会发现它是个多么好用的库.