从 JSON 中提取深度嵌套的值

Posted

技术标签:

【中文标题】从 JSON 中提取深度嵌套的值【英文标题】:Extract deeply nested values from JSON 【发布时间】:2021-08-03 14:00:34 【问题描述】:

我想从 JSON 字符串中提取坐标并将它们分成 2 列,一列用于经度,一列用于纬度。

这是位于event_location 列中的示例 JSON 字符串:


    "type": "Feature",
    "geometry": 
        "type": "Point",
        "coordinates": [-99.562992, 58.096856]
    ,
    "properties": 
        "timestamp": 160736582
    

似乎这将是一件非常简单的事情,但我无法得到它。我尝试过这样的事情:

select event_location ->> 'coordinates' as coordinates
from ...

但这只会返回整个列的所有 NULL。

我也尝试过使用json_populate_recordset,当我尝试只输入一行时,它引发了错误。

任何帮助或建议都会很棒。

【问题讨论】:

【参考方案1】:

你需要像这样使用json functions/operators:

SELECT
    event_location->'geometry'->'coordinates'->0 AS lat,
    event_location->'geometry'->'coordinates'->1 AS lon,
    -- alternate syntax
    event_location#>'geometry,coordinates,0' AS lat,
    event_location#>'geometry,coordinates,1' AS lon
FROM t

请注意,列的数据类型将是json,而不是本机 SQL 类型。要获得浮点数,您可以将值提取为文本然后转换:

SELECT
    (event_location->'geometry'->'coordinates'->>0)::numeric AS lat,
    (event_location->'geometry'->'coordinates'->>0)::numeric AS lon
FROM t

【讨论】:

太完美了,谢谢!正是我想要的!

以上是关于从 JSON 中提取深度嵌套的值的主要内容,如果未能解决你的问题,请参考以下文章

具有深度嵌套层次结构的不可变 NSDictionary:更改键的值?

如何使用 angular2 ngFor 深度嵌套的 json 值

PHP:嵌套 json 和值提取

我可以从 Relay 查询结果中提取深度嵌套的节点吗?

从深度嵌套的 JSON 创建 Pandas DataFrame

如何使用 SwiftyJSON 从深度嵌套的 JSON 字典中获取字符串 [重复]