1.获取单个json字符串里的某一特定值
函数:get_json_object(单个json,'$.要获取的字段')
示例:
代码:SELECT get_json_object('{"NAME":"张三","ID":"1"}','$.NAME') as name;
SELECT get_json_object('{"NAME":"张三","ID":"1"}','$.NAME');
运行结果:
2.获取json数组特定值
2.1假如只是想获取json数组中某特定字段的全部值,不需要分行
函数:get_json_object(单个json,'$[ 数组中的特定位置或者不写,不写就是整个数组中的某字段所有值].要获取的字段')
示例:
代码:SELECT get_json_object('[{"NAME":"张三","ID":"1"},{"NAME":"李四","ID":"2"}]','$[0].NAME');
SELECT get_json_object('[{"NAME":"张三","ID":"1"},{"NAME":"李四","ID":"2"}]','$[0].NAME');
运行结果:
示例:
代码:SELECT get_json_object('[{"NAME":"张三","ID":"1"},{"NAME":"李四","ID":"2"}]','$[].NAME');
SELECT get_json_object('[{"NAME":"张三","ID":"1"},{"NAME":"李四","ID":"2"}]','$[].NAME');
运行结果:
2.2假如只是想获取json数组中某特定字段的全部值,要分行
假如只想要将json数组分行,用explode()就行,但是只能展示json数组分出来的行,假如要解析出数组中每个json的某一字段值,那么就要利用regexp_extract,regexp_replace,split将json数组进行处理,然后再结合lateral view 及get_json_object进行分行取值
代码示例:
SELECT
tab1.除了JSON数组外想要展示的字段
,GET_JSON_OBJECT(临时表名.列重命名,'$.想要获取的字段') as 字段重命名
FROM (
SELECT 除了JSON数组外想要展示的字段 ,
split
(regexp_replace
(regexp_extract(JSON数组,'^\\[(.+)\\]$',1),--regexp_extract正则表达式解析函数
'\\}\\,\\{', '\\}\\|\\|\\{'),--regexp_replace替换
'\\|\\|') --split分割符
as str --处理json数组
FROM 表名)
tab1
lateral view explode(tab1.str) 临时表名--随意取 as 列重命名--随意取;
案例:
数据示例:
表名:classdata
class | data |
1 | [{"NAME":"张三","ID":"1"},{"NAME":"李四","ID":"2"},{"NAME":"王五","ID":"3"}] |
2 | [{"NAME":"刘二","ID":"1"},{"NAME":"邓虎","ID":"2"}] |
代码:
SELECT
tab1.class
,GET_JSON_OBJECT(tmptab .json_str ,'$.NAME') as NAME--想要ID,这样写再加一列就好
FROM (
SELECT class ,
split(regexp_replace(regexp_extract(data,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|') as eq_json_str
FROM classdata)tab1
lateral view explode(tab1.eq_json_str ) tmptab as json_str ;
运行结果:
class | NAME |
1 | 张三 |
1 | 李四 |
1 | 王五 |
2 | 刘二 |
2 | 邓虎 |