gf框架之gparser – 强大灵活的数据格式编码/解析包

gf框架针对常用的数据格式编码解析,提供了异常强大灵活的功能,由gparser包提供,支持Go变量(interface{})、Struct、JSON、XML、YAML/YML、TOML数据格式之间的相互转换,支持按照层级进行数据检索访问、支持运行时动态新增/修改/删除层级变量(并发安全)等特性。gparser包使得对于未知数据结构、多维数组结构的访问、操作变得异常的简便。

使用方式:

方法列表

方法简要说明,

  1. Load与LoadContent方法支持根据文件及内容,生成gparser.Parser对象;
  2. New方法支持生成一个空的gparser.Parser对象,常用用于动态数据生成;
  3. Get*相关方法支持按照层级检索数据,pattern参数中使用英文”.”号区分层级关系;
  4. Set方法支持按照层级修改/新增变量,变量类型支持任意类型
  5. Remove方法支持按照层级删除变量,只需要给定pattern层级检索参数即可;
  6. To*相关方法支持将gparser.Parser对象生成为支持的数据格式字符串;
  7. VarTo*相关方法支持将任意的Go变量转换为支持的数据格式字符串;

使用示例

  1. 数据层级检索

    示例1,读取JSON:

    可以看到我们可以通过英文”.”号实现非常方便的层级访问,针对于数组列表,索引从0开始,我们也可以通过”.”号访问其对应的索引项数据。

    示例2,读取XML:

    LoadContent方法的第二个参数指定内容的数据类型,可选值为(json,xml,yaml/yml,toml)。其他两种数据类型可自行测试,这里不再赘述。

  2. 处理键名本身带有层级符号”.”的情况

    当键名和层级在访问时存在pattern同名的情况,当然这并不是什么问题,以下是一个示例。

    运行之后打印出的结果为 101。当键名存在”.”号时,检索优先级:键名->层级,因此并不会引起歧义。

    再来看一个例子:

    执行后,输出结果为:

    看到了么,gparser会按照给定pattern对层级进行自动探测,检索时按照键名优先的原则,并不会出现歧义冲突。

  3. 支持运行时数据修改

    执行后输出结果为: {"users":{"count":1,"list":["John","小明"]}} gparser包的数据运行时修改特性非常强大,在该特性的支持下,各种数据结构的编码/解析显得异常的灵活方便。

  4. 运行时动态删除变量

    我们再来看一个删除变量的例子:

    以上程序输出结果为:

    可以看到,使用Remove方法可以非常方便地根据pattern参数动态删除变量。在该示例中,我们删除了article.list数组的索引0数据项,并将XML转换为JSON数据格式返回。

  5. 动态生成指定格式的编码数据

    我们来动态生成一个XML,先来一个简单一点的。

    执行后,输出结果为:

    可以看到,我们直接使用Set方式便创建了一个XML数据格式,根本就不需要struct有木有?!想要struct?当然也可以,那我们再来一个稍微复杂一点的例子,里面包含了层级新增变量以及struct数据变量:

    执行后,输出结果为:

    怎么样,有没有觉得很6?

  6. 变量与struct相互转换 示例1,struct转换为gparser.Parser对象,并转换输出为JSON格式:

    执行后,输出结果为:

    怎么样,有没有觉得很6?

    但是针对于struct处理,这里有一点需要特别说明的是,如果struct中的变量不对外公开,那么该变量同时也不能被gparser通过层级检索方式访问到。由于gparser的底层数据结构采用了json格式,如果struct同时定义了json tag,那么层级检索将会按照json tag进行检索访问,不支持struct的其他tag类型。

    示例2,变量转换为struct对象:

    执行后,输出为:

    当然,也可以直接使用gparser.VarToStruct方法来进行直接转换。

  7. 数据格式相互转换

    由于只是演示数据格式的转换,咱们来个数据结构简单点的:

    执行后,输出结果为:

    可以看到,gparser包使得数据格式的转换变得异常的方便灵活。

2 Replies to “gf框架之gparser – 强大灵活的数据格式编码/解析包”

    1. 这个gparser包实在太强大了,我作为gparser的作者,花了若干个日日夜夜茶饭不思,做出来这么一个东西自己都感觉很吃惊。

Leave a Reply to John Cancel reply

Your email address will not be published.