本文档主要介绍JSON、XML与Protobuf函数的语法规则,包括参数解释、函数示例等。

函数列表

类型 函数 说明
JSON json_select 根据JMES语法提取或计算JSON表达式中特定的值。
json_parse 将值解析为JSON对象。
XML xml_to_json 将xml转成dict再做展开操作。
protobuf pb_to_json 将Protobuf数据转成JSON数据。
IP geo_parse 根据IP地址解析出所属国家省市信息。

json_select

  • 函数格式
    json_select(值, "jmes表达式", default=None, restrict=False)
  • 参数说明
    参数名称 参数类型 是否必填 说明
    任意 传入待提取字段的JSON表达式或字段。
    jmes表达式 String JMES表达式,表示提取的字段。
    default 任意 如果提取字段不存在,则将默认字段值赋值给该字段并返回。默认为None表示不作任何操作。
    restrict Bool 默认False。严格模式,非标准JSON模式时,如果restrictTrue则会报错。
  • 返回结果

    返回提取到的值。

  • 函数示例
    • 示例1:从content提取name的值。
      原始日志:
      content:  {"name": "xiaoming", "age": 10}
      加工规则:
      e_set("json_filter",json_select(v("content"), "name"))
      加工结果:
      content:  {"name": "xiaoming", "age": 10}
      json_filter:  xiaoming
    • 示例2:从content提取name所有的值。
      原始日志:
      content:  {"name": ["xiaoming", "xiaowang", "xiaoli"], "age": 10}
      加工规则:
      e_set("json_filter",json_select(v("content"), "name[*]"))
      e_set("json_filter2",str_join("*", json_select(v('content'), "name[*]")))
      加工结果:
      content:  {"name": ["xiaoming", "xiaowang", "xiaoli"], "age": 10}
      json_filter:  ["xiaoming", "xiaowang", "xiaoli"]
      json_filter2: xiaoming*xiaowang*xiaoli
    • 示例3:从content提取name的值,返回默认default。
      原始日志:
      content:  {"name": "xiaoming", "age": 10}
      加工规则:
      e_set("json_filter",json_select(v("content"), "name1.name2", default="default"))
      加工结果:
      content:  {"name": "xiaoming", "age": 10}
      json_filter: default

json_parse

  • 函数格式
    json_parse(值, default=None, restrict=False)
  • 参数说明
    参数名称 参数类型 是否必填 说明
    String 传入需要被解析的字段。
    default 任意 如果提取字段不存在,则将默认字段值赋值给该字段并返回。默认为None表示不作任何操作。
    restrict Bool 默认False。严格模式,非标准JSON模式时,如果restrictTrue则会报错。
  • 返回结果

    返回转换后的JSON对象。

  • 函数示例
    原始日志:
    content:  {"abc": 123, "xyz": "test" }
    加工规则:
    e_set("json",json_parse(v("content")))
    加工结果:
    content:  {"abc": 123, "xyz": "test" }
    json:  {"abc": 123, "xyz": "test"}

xml_to_json

  • 函数格式
    xml_to_json(值)
  • 参数说明
    参数名称 参数类型 是否必填 说明
    String 传入需要被转换的字段。
  • 返回结果

    返回转换后的JSON数据。

  • 函数示例
    原始日志:
    str : <?xmlversion="1.0"?><data><countryname="Liechtenstein"><rank>1</rank><year>2008</year><gdppc>141100</gdppc><neighborname="Austria"direction="E"/><neighborname="Switzerland"direction="W"/></country><countryname="Singapore"><rank>4</rank><year>2011</year><gdppc>59900</gdppc><neighborname="Malaysia"direction="N"/></country><countryname="Panama"><rank>68</rank><year>2011</year><gdppc>13600</gdppc><neighborname="Costa Rica"direction="W"/><neighborname="Colombia"direction="E"/></country></data>
    加工规则:
    e_set("str_json",xml_to_json(v("str")))
    加工结果:
    str : <?xmlversion="1.0"?><data><countryname="Liechtenstein"><rank>1</rank><year>2008</year><gdppc>141100</gdppc><neighborname="Austria"direction="E"/><neighborname="Switzerland"direction="W"/></country><countryname="Singapore"><rank>4</rank><year>2011</year><gdppc>59900</gdppc><neighborname="Malaysia"direction="N"/></country><countryname="Panama"><rank>68</rank><year>2011</year><gdppc>13600</gdppc><neighborname="Costa Rica"direction="W"/><neighborname="Colombia"direction="E"/></country></data>
    str_json : {"data": {"country": [{"@name": "Liechtenstein", "rank": "1", "year": "2008", "gdppc": "141100", "neighbor": [{"@name": "Austria", "@direction": "E"}, {"@name": "Switzerland", "@direction": "W"}]}, {"@name": "Singapore", "rank": "4", "year": "2011", "gdppc": "59900", "neighbor": {"@name": "Malaysia", "@direction": "N"}}, {"@name": "Panama", "rank": "68", "year": "2011", "gdppc": "13600", "neighbor": [{"@name": "Costa Rica", "@direction": "W"}, {"@name": "Colombia", "@direction": "E"}]}]}}

pb_to_json

  • 函数格式
    pb_to_json(pb_data,pb_py_path_str,pb_fun_name)
  • 参数说明
    参数名称 参数类型 是否必填 说明
    pb_data String 传入要转换JSON的protobuf数据或字段名。
    pb_py_path_str String Protobuf文件名。例如addressbook.proto文件取addressbook
    pb_fun_name String Protobuf文件中消息名。
  • 返回结果

    返回转换后的JSON数据。

  • 函数示例
    addressbook.proto文件:
    '''addressbook.proto文件'''
    syntax = "proto3";
    message Person {
      string name = 1;
      int32 id = 2;
      string email = 3;
      string university = 5;
      int32 age = 6;
    
      enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
      }
    
      message PhoneNumber {
        string number = 1;
        PhoneType type = 2;
      }
    
      repeated PhoneNumber phones = 4;
    }
    
    message AddressBook {
      repeated Person people = 1;
    }
    原始日志:
    content: \n3\n\x05twiss\x10\x01\x1a\x0ftwiss@gkate.com"\x0f\n\x0b13099922287\x10\x01*\x04Henu0\x18\nC\n\x04Iran\x10\x02\x1a\x10Iran@alibaba.com"\x0f\n\x0b13022244455\x10\x01*\x14West Leak University0\x02
    加工规则:
    e_set("data_json",pb_to_json(v("content"),"addressbook","AddressBook"))
    加工结果:
    content: \n3\n\x05twiss\x10\x01\x1a\x0ftwiss@gkate.com"\x0f\n\x0b13099922287\x10\x01*\x04Henu0\x18\nC\n\x04Iran\x10\x02\x1a\x10Iran@alibaba.com"\x0f\n\x0b13022244455\x10\x01*\x14West Leak University0\x02
    data_json : {'people': [{'name': 'twiss', 'id': 1, 'email': 'twiss@gkate.com', 'phones': [{'number': '13099922287', 'type': 1}], 'university': 'Henu', 'age': 24}, {'name': 'Iran', 'id': 2, 'email': 'Iran@alibaba.com', 'phones': [{'number': '13022244455', 'type': 1}], 'university': 'West Leak University', 'age': 2}]}

geo_parse

  • 函数格式
    geo_parse("ip",ip_db,keep_fields=None)
  • 参数说明
    参数名称 参数类型 是否必填 说明
    ip IP字符串 IP字符串。
    ip_db IP库内容 唯一IP库,当前使用res_oss_file(endpoint, ak_id, ak_key, bucket, file, format='text', change_detect_interval=0,fetch_interval=2,refresh_retry_max=60,encoding='utf8',error='ignore'),参数定义请参见res_oss_file,该函数获取IP库使用的形式为format='binary'
    keep_fields 元组 返回的字典中包含的key信息。默认信息如下:
    • city:表示城市名称。
    • region:表示省份名称。
    • country:表示国家名称。

    例如keep_fields=("city","country")表示仅输出citycontry字段信息。

    此外keep_fields也支持重命名。例如(("city","cty"),("contry","state"))表示以ctystate形式输出。

  • 返回结果
    返回字典形式数据,包含如下内容:
    {
      "city": "...",
      "province":"...",
      "country": "..."
    }
  • 函数示例
    • 示例1
      原始日志:
      ip : 1.2.3.4
      加工规则:
      e_set("geo",geo_parse(v("ip"), ip_db=res_oss_file(endpoint='http://oss-cn-hangzhou.aliyuncs.com',
                                                       ak_id='your ak_id',
                                                       ak_key='your ak_key',
                                                       bucket='your bucket', file='ipipfree.ipdb',
                                                                     format='binary',change_detect_interval=20)))
      加工结果:
      ip : 1.2.3.4
      geo :{'city': '杭州', 'province':'浙江省','country': '中国'}
    • 示例2:选择输出域并且重命名。
      原始日志:
      ip : 1.2.3.4
      加工规则:
      e_set("geo",geo_parse(v("ip"), ip_db=res_oss_file(endpoint='http://oss-cn-hangzhou.aliyuncs.com',
                                                       ak_id='your ak_id',
                                                       ak_key='your ak_key',
                                                       bucket='your bucket', file='ipipfree.ipdb',
                                                                     format='binary',change_detect_interval=20),keep_fields=(("city","cty"),("country","state"),("province","pro"))))
      加工结果:
      ip : 1.2.3.4
      geo :{ "state": "中国","pro": "浙江省","cty": "杭州"}
    • 示例3:选择输出域。
      原始日志:
      ip : 1.2.3.4
      加工规则:
      e_set("geo",geo_parse(v("ip"), ip_db=res_oss_file(endpoint='http://oss-cn-hangzhou.aliyuncs.com',
                                                       ak_id='your ak_id',
                                                       ak_key='your ak_key',
                                                       bucket='your bucket', file='ipipfree.ipdb',
                                                                     format='binary',change_detect_interval=20),keep_fields=("country","province")))
      加工结果:
      ip : 1.2.3.4
      geo :{ "country": "中国","province": "浙江省"}