从 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字符串中提取数组元素?

我需要从嵌套在 JSON 对象中的名为 token 的字段中解析或提取字符串,以便替换会话令牌的电子邮件和密码

使用 Spark 从 DynamoDB JSON 字符串中提取嵌套的 Json 字段?

使用jsonpath提取复杂响应中的数组及其他字段

如何创建从 MATLAB 中的结构中提取的值的字符串数组?