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;

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值