json-filter
json-filter copied to clipboard
golang json字段过滤,复用struct 随意选择你想要输出为json的结构体字段。 json filter Golang's JSON filter randomly selects the structure fields you want to output as JSON,Let go have dynamic language l...
微信技术交流群
会持续更新
该issue主要讨论如何对过滤性能进行进一步提升,目前此项目是利用反射获取结构体的字段信息,把打标记的字段提取出来,挂载在一个n叉树的结构体上,在过滤时为了提高性能,利用了缓存,进行了3个版本的优化策略 最早版本 : 遍历整个结构体的所有字段,遍历到最深层,然后每遍历一个字段就获取一下字段的json tag 然后判断是否被选中,提取出需要用的 目前版本:缓存了所有结构体字段的tag信息,遍历每一个字段时即可知道该字段是否选中,不需要获取tag信息,不需要字符串处理,有了很大的性能提升, 目前优化的新版本:在调用过滤方法时,根据结构体的pkg path生成一个新的缓存n叉树,该数据结构仅仅存储该结构体在该缓存场景下的所有字段的index下标信息,在遍历结构体时根据下标跳过那些被过滤掉的字段,此时避免了大部分无用的反射,而且不需要进行字符串处理,性能又进行了很大幅度的提升(特别是在,select模式下一个10个字段的结构体,选择了2-3个等类似操作,也就是字段很多却选中很少的情况下此时性能会暴击提升,因为其余的7-8个字段根本不会被反射) 接下来的优化方向:内置json编码功能,提升反射性能
想请教一下,json-filter在序列化某个含有其他实现了自定义序列化函数的结构体时候,无法调用到这个函数的自定义序列化函数,比如下列定义 ``` type a struct{ Field StringArray `json: "field,select(test)"` } type StringArray struct{ V []string } func (n *StringArray) MarshalJSON() ([]byte, error) { return json.Marshal(n.V) } ``` 理想状态下,对结构体a进行序列化验证代码如下: ``` package...