用于一个标准的JSON字符串中,按照输入的一组键(key1,key2,...)抽取各个键指定的字符串。

命令格式

string json_tuple(string <json>, string <key1>, string <key2>,...)

参数说明

  • json:必填。STRING类型,标准的JSON格式字符串。

  • key:必填。STRING类型,用于描述在JSON中的path,一次可输入多个,不能以美元符号($)开头。MaxCompute支持用.['']这两种字符解析JSON,当JSON的Key本身包含.时,可以用['']来替代。

返回值说明

返回STRING类型。

说明
  • 如果JSON为空或者为非法的JSON格式,返回NULL。

  • 如果键Key为空或者不合法(JSON中不存在)返回NULL。

  • 如果JSON合法,键Key也存在,则返回对应字符串。

  • 支持包含中文的JSON数据解析。

  • 支持多层嵌套的JSON数据解析。

  • 支持包含多重嵌套的数组的JSON数据解析。

  • 解析行为和设置了set odps.sql.udf.getjsonobj.new=true;后的GET_JSON_OBJECT的行为保持一致。在需要对同一个JSON字符串多次解析的情况下,相比于多次调用GET_JSON_OBJECT,JSON_TUPLE可以一次输入多个Key,且JSON字符串只被解析一次,效率更高。

  • JSON_TUPLE是UDTF,在需要选取其他列时应配合Lateral View使用。

使用示例

--创建一张表school。
create table school (id string, json string);
--向表中插入数据。
insert into school (id, json) values ("1", "{
\"school\": \"湖畔大学\", \"地址\":\"杭州\", \"SchoolRank\": \"00\", 
\"Class1\":{\"Student\":[{\"studentId\":1,\"scoreRankIn3Year\":[1,2,[3,2,6]]}, 
{\"studentId\":2,\"scoreRankIn3Year\":[2,3,[4,3,1]]}]}}");
  • 示例1:提取JSON对象信息。命令示例如下。

    select json_tuple(school.json,"SchoolRank","Class1") as (item0, item1) from school;
    --等效于如下语句。
    select get_json_object(school.json,"$.SchoolRank") item0,get_json_object(school.json,"$.Class1") item1 from school;
    
    --返回结果如下。
    +-------+-------+
    | item0 | item1 |
    +-------+-------+
    | 00    | {"Student":[{"studentId":1,"scoreRankIn3Year":[1,2,[3,2,6]]},{"studentId":2,"scoreRankIn3Year":[2,3,[4,3,1]]}]} |
    +-------+-------+
  • 示例2:使用['']提取JSON对象信息。命令示例如下。

    select json_tuple(school.json,"school","['Class1'].Student") as (item0, item2) from school where id=1;
    --返回结果如下。
    +-------+-------+
    | item0 | item2 |
    +-------+-------+
    | 湖畔大学 | [{"studentId":1,"scoreRankIn3Year":[1,2,[3,2,6]]},{"studentId":2,"scoreRankIn3Year":[2,3,[4,3,1]]}] |
  • 示例3:支持解析包含中文的JSON数据。命令示例如下。

    select json_tuple(school.json,"school","地址") as (item0,item1) from school;
    --返回结果如下。
    +-------+-------+
    | item0 | item1 |
    +-------+-------+
    | 湖畔大学 | 杭州 |
    +-------+-------+
  • 示例4:支持解析多层嵌套的JSON数据。命令示例如下。

    select sc.Id, q.item0, q.item1 
    from school sc lateral view json_tuple(sc.json,"Class1.Student[*].studentId","Class1.Student[0].scoreRankIn3Year") q as item0,item1;
    
    --返回结果如下。
    +------------+-------+-------+
    | id         | item0 | item1 |
    +------------+-------+-------+
    | 1          | [1,2] | [1,2,[3,2,6]] |
    +------------+-------+-------+
  • 示例5:支持解析包含多重嵌套数组的JSON数据。命令示例如下。

    select sc.Id, q.item0, q.item1
    from school sc lateral view json_tuple(sc.json,"Class1.Student[0].scoreRankIn3Year[2]","Class1.Student[0].scoreRankIn3Year[2][1]") q as item0,item1;
    --返回结果如下。
    +------------+-------+-------+
    | id         | item0 | item1 |
    +------------+-------+-------+
    | 1          | [3,2,6] | 2     |
    +------------+-------+-------+

相关函数

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

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

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