从 JSON 数组中的字符串中提取字段
Posted
技术标签:
【中文标题】从 JSON 数组中的字符串中提取字段【英文标题】:Extracting fields from a string in JSON array 【发布时间】:2020-07-14 11:43:41 【问题描述】:我对雪花很陌生。我在 snowflake 中查询了一些 JSON 数据,尽管下面的 JSON 数组中有一个长字符串“元数据”,我需要从以下 JSON 对象中提取一些字段。
"metaData": "code:VALID_ERROR,message: the provided credentials
were not correct,type: ITEM_ERROR,exit_status: null,action_id: dax_123,
action_name: Queentech,
session_id: 678-902-6y78,type: null,
name: null,timestamp: 2020-07-11T20:52:59.158Z,timestamp_epoch_sec: 1594500779",
"statusId": "3478-901fg-u9710"
我给这个对象起了别名header
。
我试过了
select header:statusId::varchar as statusid,
header.metadata.code ::varchar as code,
header.metadata.message::varchar as message
from test
where header:status_id ='3478-901fg-u9710'
我得到了代码和消息的 NULL 值。任何帮助,将不胜感激。 谢谢! 塔拉·帕尔默
::variant 作为有效负载
【问题讨论】:
【参考方案1】:欢迎使用 Stack Overflow 和 Snowflake! documentation 可以帮助弄清楚如何使用 JSON 对象查询 VARIANT 列。您需要先回答两个问题:
-
表中的 JSON 是否存储为文本?如果是这样,您将需要在该字段上调用 PARSE_JSON()。
您是否正在尝试查询嵌套数组?如果是这样,您将需要在该字段上使用 FLATTEN()。
在排除问题之前,请确保您了解如何回答这两个问题。这将使故障排除过程更容易。当您在 JSON 中查询一个对象时,您使用 header:field_you_want
调用它的“元数据”字段。请注意,字段之间有一个冒号。如果你想要更进一步的东西,可以使用句点。 header:field_you_want.some_value
因此,您清理后的查询看起来更像以下内容:
select header:statusId as statusid,
header:metadata.code as code,
header:metadata.message as message
from test
where header:status_id ='3478-901fg-u9710'
【讨论】:
【参考方案2】:我已经尝试过,它有效。您的列名不正确。我没有看到任何 status_id
WITH X AS (
SELECT PARSE_JSON($1) AS header
FROM VALUES ($$
"metaData": "code:VALID_ERROR,message: the provided credentials were not correct,type: ITEM_ERROR,exit_status: null,action_id: dax_123,action_name: Queentech,session_id: 678-902-6y78,type: null,name: null,timestamp: 2020-07-11T20:52:59.158Z,timestamp_epoch_sec: 1594500779",
"statusId": "3478-901fg-u9710"
$$)
)
select header:statusId::varchar as statusid
,header:metaData:code ::varchar as code
,header:metadata.message::varchar as message
from X
where header:statusId::varchar = '3478-901fg-u9710'
;
编辑:跟随 sn-p 仅展平标题和元数据列。它不会像原始查询那样返回结果。但是这个查询可以扩展
--Following Json is in correct format
create or replace table sample_json as
SELECT PARSE_JSON($1) AS header
FROM VALUES ($$
"metaData": "code:'VALID_ERROR',message: 'the provided credentials were not correct'",
"statusId": "3478-901fg-u9710"
$$)
;
select ,
g.path , g.value
from sample_json c,
lateral flatten(input => header) f
, lateral flatten(input => parse_json(f.value)) g
where f.key = 'metaData'
;
【讨论】:
非常感谢!使用上述代码的代码和消息仍然显示 NULL 而不是实际值。 上述脚本没有被展平,因为 metaData 列也是一个变体。我用扁平化的 json 编辑了我的答案 谢谢伊克拉伊贾兹。如果数据采用以下格式,您的代码运行良好:“metaData”:“代码:VALID_ERROR,消息:提供的凭据不正确,类型:ITEM_ERROR,exit_status:null,action_id:dax_123,action_name:Queentech,session_id: 678-902-6y78,类型:null,名称:null,时间戳:2020-07-11T20:52:59.158Z,timestamp_epoch_sec:1594500779”,“statusId”:“3478-901fg-u9710” 我没有得到结果,因为我的数据格式不同:元数据后没有大括号。 “metaData”:“代码:VALID_ERROR,消息:提供的凭据不正确,类型:ITEM_ERROR,exit_status:null,action_id:dax_123,action_name:Queentech,session_id:678-902-6y78,类型:null,名称:null ,timestamp: 2020-07-11T20:52:59.158Z,timestamp_epoch_sec: 1594500779", "statusId": "3478-901fg-u9710"以上是关于从 JSON 数组中的字符串中提取字段的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Swift 中的加密 JSON 字符串中提取某些字段?
我需要从嵌套在 JSON 对象中的名为 token 的字段中解析或提取字符串,以便替换会话令牌的电子邮件和密码