Hive解析json字符串(json数组)

Json字符串

首先我们得要知道什么是,json字符串,json格式如下所示

{"code":o} -- 错误的json字符串
{"code":true} -- 正确的错误的json字符串
{"code":"o"} -- 正确的json字符串
{"code":{"code_1":"o_1","code_2":"o_2"}} -- 正确的json字符串
{"code":"{"code_1":"o_1","code_2":"o_2"}"} -- 错误的json字符串(明显是双引号错乱了)
{"code":[{"code_1":"o_1","code_2":"o_2"},{"code_3":"o_3","code_4":"o_4"}]} -- 正确的json字符串(放的json数组)

json字符串解析函数,get_json_object,json_tuple

因为有的从业务系统传过来的json字符串带有其它的字符,导致json字符串到数据库存储之后并不规范无法直接使用相应的json处理函数解析,这时候我们就需要借助字符串处理函数,比如:字符串分割,字符串替换等函数来把异常的json字符串处理成正确有效的格式。

这个规范json字符串就不操作了,大家可以看看下面的实例

具体需求

下面是一个解析“json字符串”的实例,字符串如下

"[\"{\\\"shippingTime\\\":\\\"2022-05-18(周三)上午 09:30前\\\",\\\"isClick\\\":0,\\\"isOptional\\\":0,\\\"optionalCode\\\":1,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-18(周三)下午 16:00前\\\",\\\"isClick\\\":0,\\\"isOptional\\\":0,\\\"optionalCode\\\":1,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-19(周四)上午 09:30前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-19(周四)下午 16:00前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-20(周五)上午 09:30前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-20(周五)下午 16:00前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\"]"

先把字符串处理成json格式,这里处理的时候注意,因为结果是json数组,为了保证json格式不变又能将每个json字符串成功清洗出来,所以要把原本的逗号分割的json替换成用分号(唯一分隔符)分割

select replace(regexp_replace('"[\"{\\\"shippingTime\\\":\\\"2022-05-18(周三)上午 09:30前\\\",\\\"isClick\\\":0,\\\"isOptional\\\":0,\\\"optionalCode\\\":1,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-18(周三)下午 16:00前\\\",\\\"isClick\\\":0,\\\"isOptional\\\":0,\\\"optionalCode\\\":1,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-19(周四)上午 09:30前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-19(周四)下午 16:00前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-20(周五)上午 09:30前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-20(周五)下午 16:00前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\"]"'
	,'"\\["|\\\\|"\\]"',''),'}","{','};{')

上面处理后的字符串如下,

{"shippingTime":"2022-05-18(周三)上午 09:30前","isClick":0,"isOptional":0,"optionalCode":1,"optionalType":""};{"shippingTime":"2022-05-18(周三)下午 16:00前","isClick":0,"isOptional":0,"optionalCode":1,"optionalType":""};{"shippingTime":"2022-05-19(周四)上午 09:30前","isClick":1,"isOptional":0,"optionalCode":0,"optionalType":""};{"shippingTime":"2022-05-19(周四)下午 16:00前","isClick":1,"isOptional":0,"optionalCode":0,"optionalType":""};{"shippingTime":"2022-05-20(周五)上午 09:30前","isClick":1,"isOptional":0,"optionalCode":0,"optionalType":""};{"shippingTime":"2022-05-20(周五)下午 16:00前","isClick":1,"isOptional":0,"optionalCode":0,"optionalType":""}

然后就可以直接用处理json字符串的函数处理,因为结果是json数组,所以这里配合了 explode和split函数

select json_tuple(json,'shippingTime','isClick','isOptional','optionalCode','optionalType') as (shippingTime,isClick,isOptional,optionalCode,optionalType)
from(select explode(split(
    replace(regexp_replace('"[\"{\\\"shippingTime\\\":\\\"2022-05-18(周三)上午 09:30前\\\",\\\"isClick\\\":0,\\\"isOptional\\\":0,\\\"optionalCode\\\":1,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-18(周三)下午 16:00前\\\",\\\"isClick\\\":0,\\\"isOptional\\\":0,\\\"optionalCode\\\":1,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-19(周四)上午 09:30前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-19(周四)下午 16:00前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-20(周五)上午 09:30前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\",\"{\\\"shippingTime\\\":\\\"2022-05-20(周五)下午 16:00前\\\",\\\"isClick\\\":1,\\\"isOptional\\\":0,\\\"optionalCode\\\":0,\\\"optionalType\\\":\\\"\\\"}\"]"'
	,'"\\["|\\\\|"\\]"',''),'}","{','};{')
,';')) as json) t1;

以上,希望可以帮助到大家

你可能感兴趣的:(Hive,json,hive,sql)