详情页标题前

阿里云云原生大数据计算服务 MaxComputeGET_JSON_OBJECT-云淘科技

详情页1

在一个标准JSON字符串中,按照指定方式抽取指定的字符串。

使用说明

GET_JSON_OBJECT函数的作用是在一个标准JSON字符串中,按照JSON PATH抽取指定的字符串。当前函数的入参支持两种类型

  • 入参为JSON类型:基于最新支持的JSON数据类型,采用更为规范的JSON PATH。

  • 入参为STRING类型:原有的JSON PATH解析方式。

入参类型不同时函数的使用方式和注意事项不同,本文为您展示入参分别为JSON和STRING类型时,GET_JSON_OBJECT函数的使用方法。

说明

新JSON类型所使用的JSON PATH与原有的JSON PATH规范不同,可能存在兼容性问题。

入参为JSON类型

命令格式

json get_json_object(json , string )

参数说明

  • json:必填,待处理的JSON数据。

  • json_path:必填,需要返回的值的JSON路径。

返回值说明

返回JSON类型。

使用示例

  • 示例1:从JSON中获取key为a的value值。

    select get_json_object(json '{"a":1, "b":2}', '$.a');

    返回结果:

    +-----+
    | _c0 |
    +-----+
    | 1   |
    +-----+
  • 示例2:从JSON中获取key为c的value值。

    select get_json_object(json '{"a":1, "b":2}', '$.c');

    返回结果:

    +-----+
    | _c0 |
    +-----+
    | NULL |
    +-----+
  • 示例3:JSON Path非法时,返回NULL。

    select get_json_object(json '{"a":1, "b":2}', '$invalid_json_path');

    返回结果:

    +-----+
    | _c0 |
    +-----+
    | NULL |
    +-----+

入参为STRING类型

背景信息

在一个标准JSON字符串中,按照path抽取指定的字符串。每次调用该函数时,都会读一次原始数据,因此反复调用可能影响性能和产生费用。您可以通过get_json_object,结合UDTF,轻松转换JSON格式日志数据,避免多次调用函数,详情请参见利用MaxCompute内建函数及UDTF转换JSON格式日志数据。

参数说明

  • json:必填。STRING类型。标准的JSON格式对象,格式为{Key:Value, Key:Value,...}。如果遇到英文双引号(”),需要用两个反斜杠(\)进行转义。如果遇到英文单引号(’),需要用一个反斜杠(\)进行转义。

  • path:必填。STRING类型。表示在json中的path,以$开头。更多path信息,请参见LanguageManual UDF。相关最佳实践案例,请参见JSON数据从OSS迁移至MaxCompute。不同字符的含义如下:

    • $:表示根节点。

    • .['']:表示子节点。MaxCompute支持用这两种字符解析JSON对象,当JSON的Key本身包含.时,可以用['']来替代。

    • [][number]表示数组下标,从0开始。

    • *Wildcard for [],返回整个数组。*不支持转义。

限制条件

['']取数只在新版本中支持,您需要添加设置Flag的语句set odps.sql.udf.getjsonobj.new=true;

命令格式

string get_json_object(string , string )

返回值说明

  • 如果json为空或非法的json格式,返回NULL。

  • 如果json合法,path也存在,则返回对应字符串。

  • 您可以通过在Session级别设置odps.sql.udf.getjsonobj.new属性来控制函数的返回方式:

    • 当设置set odps.sql.udf.getjsonobj.new=true;时,函数返回行为更标准,处理数据更方便,性能更好,推荐您使用此配置,函数返回行为规则如下:

      • 返回值仍是一个JSON字符串,可以继续当作JSON来解析,而不再需要额外使用replace或regexp_replace等函数替换反斜线。

      • 一个JSON对象中可以出现相同的Key,可以成功解析,返回第一个Value值。

        --返回1。
        select get_json_object('{"a":"1","a":"2"}', '$.a');
      • 输出结果按照JSON字符串的原始排序方式输出。

        --返回{"b":"1","a":"2"}。
        select get_json_object('{"b":{"b":"1","a":"2"},"a":"2"}', '$.b');
    • 当设置set odps.sql.udf.getjsonobj.new=false;时,函数返回行为规则如下:

      说明

      Hive兼容模式,get_json_object使用的是新版本的行为。

      • 换行符(
        )、引号(”)等JSON保留字符使用字符串'
        '
        '\"'显示。

      • 一个JSON对象中不可以出现相同的Key,可能导致无法解析。

        --返回NULL。
        select get_json_object('{"a":"1","a":"2"}', '$.a');
      • 输出结果按照字典排序方式输出。

        --返回{"a":"2","b":"1"}。
        select get_json_object('{"b":{"b":"1","a":"2"},"a":"2"}', '$.b');

使用示例

  • 示例1:提取JSON对象src_json.json中的信息。命令示例如下。

    --JSON对象src_json.json的内容。
    +----+
    json
    +----+
    {"store":
    {"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],
    "bicycle":{"price":19.95,"color":"red"}
    },
    "email":"amy@only_for_json_udf_test.net",
    "owner":"amy"
    }
    --提取owner字段信息,返回amy。
    select get_json_object(src_json.json, '$.owner') from src_json;
    --提取store.fruit字段第一个数组信息,返回{"weight":8,"type":"apple"}。
    select get_json_object(src_json.json, '$.store.fruit[0]') from src_json;
    --提取不存在的字段信息,返回NULL。
    select get_json_object(src_json.json, '$.non_exist_key') from src_json;
  • 示例2:提取数组型JSON对象的信息。命令示例如下。

    --返回2222。
    select get_json_object('{"array":[["aaaa",1111],["bbbb",2222],["cccc",3333]]}','$.array[1][1]');
    --返回["h0","h1","h2"]。
    set odps.sql.udf.getjsonobj.new=true;
    select get_json_object('{"aaa":"bbb","ccc":{"ddd":"eee","fff":"ggg","hhh":["h0","h1","h2"]},"iii":"jjj"}','$.ccc.hhh[*]');
    --返回["h0","h1","h2"]。
    set odps.sql.udf.getjsonobj.new=false;
    select get_json_object('{"aaa":"bbb","ccc":{"ddd":"eee","fff":"ggg","hhh":["h0","h1","h2"]},"iii":"jjj"}','$.ccc.hhh');
    --返回h1。
    select get_json_object('{"aaa":"bbb","ccc":{"ddd":"eee","fff":"ggg","hhh":["h0","h1","h2"]},"iii":"jjj"}','$.ccc.hhh[1]');
  • 示例3:提取带有.的JSON对象中的信息。命令示例如下。

    --创建一张表。
    create table mf_json (id string, json string);
    --向表中插入数据,Key带.。
    insert into table mf_json (id, json) values ("1", "{
    \"China.beijing\":{\"school\":{\"id\":0,\"book\":[{\"title\": \"A\",
    \"price\": 8.95},{\"title\": \"B\",\"price\": 10.2}]}}}");
    --向表中插入数据,Key不带.。
    insert into table mf_json (id, json) values ("2", "{
    \"China_beijing\":{\"school\":{\"id\":0,\"book\":[{\"title\": \"A\",
    \"price\": 8.95},{\"title\": \"B\",\"price\": 10.2}]}}}");
    --取id的值,查询key为China.beijing,返回0。由于包含.,只能用['']来解析。
    select get_json_object(json, "$['China.beijing'].school['id']") from mf_json where id =1;
    --取id的值,查询key为China_beijing,返回0。查询方法有如下两种。
    select get_json_object(json, "$['China_beijing'].school['id']") from mf_json where id =2;
    select get_json_object(json, "$.China_beijing.school['id']") from mf_json where id =2;
  • 示例4:JSON输入为空或非法格式。命令示例如下。

    --返回NULL。
    select get_json_object('','$.array[1][1]');
    --返回NULL。
    select get_json_object('"array":["aaaa",1111],"bbbb":["cccc",3333]','$.array[1][1]');
  • 示例5:JSON字符串涉及转义。命令示例如下。

    set odps.sql.udf.getjsonobj.new=true;
    --返回"1"。
    select get_json_object('{"a":"\"1\"","b":"2"}', '$.a'); 
    --返回'1'。
    select get_json_object('{"a":"\'1\'","b":"2"}', '$.a'); 

相关函数

GET_JSON_OBJECT函数属于复杂类型函数或字符串函数。

  • 更多对复杂类型数据(例如ARRAY、MAP、STRUCT、JSON数据)的处理函数请参见复杂类型函数。

  • 更多查找字符串、转换字符串格式的相关函数请参见字符串函数。

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/157172.html

(0)
上一篇 2023年12月10日 上午12:51
下一篇 2023年12月10日 上午12:52
详情页2

相关推荐

  • 阿里云日志服务SLS结果字段说明-云淘科技

    智能异常分析的结果数据保存在名为internal-ml-log的Logstore中。本文介绍结果数据中的字段详情。 通用的tag结构说明 各类任务的结果数据中都包含如下通用字段。说明 您可以通过__tag__:__job_name__和__tag__:__schedule_id__字段,查询对应任务的结果数据。 __tag__:__apply_time__:…

    阿里云日志服务SLS 2023年12月10日
  • 阿里云日志服务SLS自定义函数开发指南-云淘科技

    当您通过函数计算消费日志数据时,在不同场景您可以选择使用日志服务提供的函数模板或自定义函数。本文介绍如何构建一个自定义函数。 函数Event 函数Event即运行函数计算的入口参数,格式为一个JSON Object序列化后字符串。 参数说明 参数 说明 jobName 日志服务ETL Job名称。函数计算服务上的日志服务触发器对应一个日志服务的ETL Job…

    阿里云日志服务SLS 2023年12月10日
  • 阿里云RDS数据库ModifyDBInstanceConnectionMode – 开启或关闭数据库代理-云淘科技

    开启或关闭数据库代理,已下线。 接口说明 说明 该API已下线。调试您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。 调试调试授权信息下表是API对应的授权信息,可以在RAM权限策略语句的Action元素中使用,用来给RAM用户或RAM角色授予调用此API…

    阿里云数据库 2023年12月9日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云日志服务SLS使用资源函数增量获取数据-云淘科技

    使用增量拉取模式获取数据时,日志服务每次只拉取新增或更新的数据,效率高。本文介绍如何使用res_rds_mysql函数增量获取RDS MySQL数据库中的数据。 前提条件 日志服务 已上传数据到日志服务源Logstore中。具体操作,请参见数据采集。 已创建日志服务目标Logstore。具体操作,请参见创建Logstore。 如果您使用的是RAM用户,则需要…

    2023年12月10日
  • 阿里云云原生大数据计算服务 MaxComputeQUALIFY-云淘科技

    MaxCompute支持使用QUALIFY语法根据您指定的过滤条件过滤窗(Window)函数的结果,QUALIFY语法过滤Window函数数据类似于HAVING语法处理经过聚合函数和GROUP BY后的数据。本文为您介绍QUALIFY语法和使用示例。 功能简介 在一个查询语句中QUALIFY语法的执行顺序在WINDOW函数之后,用于对窗口函数处理后的数据进行…

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。