如何在PostgreSQL中解析此JSON字段?

时间:2019-12-05 20:42:56

标签: json postgresql

我在表中有一列似乎是JSON,但是我不确定如何解析它(PostgreSQL)。

以下是感兴趣的数据示例:

[{'identifier': 'goals_scored', 'a': [{'value': 1, 'element': 278}], 'h': [{'value': 1, 'element': 183}, {'value': 1, 'element': 188}, {'value': 1, 'element': 191}]}, {'identifier': 'assists', 'a': [{'value': 1, 'element': 283}], 'h': [{'value': 1, 'element': 182}, {'value': 1, 'element': 187}, {'value': 1, 'element': 188}, {'value': 1, 'element': 191}]}, {'identifier': 'own_goals', 'a': [{'value': 1, 'element': 277}], 'h': []}, {'identifier': 'penalties_saved', 'a': [], 'h': []}, {'identifier': 'penalties_missed', 'a': [], 'h': []}, {'identifier': 'yellow_cards', 'a': [{'value': 1, 'element': 283}, {'value': 1, 'element': 288}], 'h': []}, {'identifier': 'red_cards', 'a': [], 'h': []}, {'identifier': 'saves', 'a': [{'value': 4, 'element': 280}], 'h': [{'value': 2, 'element': 189}, {'value': 2, 'element': 526}]}, {'identifier': 'bonus', 'a': [{'value': 1, 'element': 278}], 'h': [{'value': 3, 'element': 188}, {'value': 2, 'element': 191}]}, {'identifier': 'bps', 'a': [{'value': 32, 'element': 278}, {'value': 19, 'element': 280}, {'value': 18, 'element': 273}, {'value': 16, 'element': 274}, {'value': 16, 'element': 283}, {'value': 15, 'element': 276}, {'value': 12, 'element': 286}, {'value': 11, 'element': 290}, {'value': 10, 'element': 287}, {'value': 3, 'element': 434}, {'value': 2, 'element': 277}, {'value': 1, 'element': 285}, {'value': -3, 'element': 288}], 'h': [{'value': 46, 'element': 188}, {'value': 40, 'element': 191}, {'value': 27, 'element': 183}, {'value': 26, 'element': 187}, {'value': 24, 'element': 182}, {'value': 18, 'element': 197}, {'value': 15, 'element': 181}, {'value': 12, 'element': 198}, {'value': 11, 'element': 199}, {'value': 10, 'element': 184}, {'value': 7, 'element': 189}, {'value': 7, 'element': 526}, {'value': 3, 'element': 192}, {'value': 3, 'element': 200}]}]

层次结构与我习惯的不同,并且通常的->和->>解析似乎不起作用。

有什么提示吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

这既轻松又快捷,但是如果我将字符串中的所有单引号更改为引号,然后运行类似的操作,则可以提取数据。我相信您可以做得更优雅。

select
qq.a::jsonb->0->>'element'
from
(select
    q.j->0->>'a' as a
 from
    (select
        '[{"identifier": "goals_scored", "a": [{"value": 1, "element": 278}], "h": [{"value": 1, "element": 183}, {"value": 1, "element": 188}, {"value": 1, "element": 191}]}, {"identifier": "assists", "a": [{"value": 1, "element": 283}], "h": [{"value": 1, "element": 182}, {"value": 1, "element": 187}, {"value": 1, "element": 188}, {"value": 1, "element": 191}]}, {"identifier": "own_goals", "a": [{"value": 1, "element": 277}], "h": []}, {"identifier": "penalties_saved", "a": [], "h": []}, {"identifier": "penalties_missed", "a": [], "h": []}, {"identifier": "yellow_cards", "a": [{"value": 1, "element": 283}, {"value": 1, "element": 288}], "h": []}, {"identifier": "red_cards", "a": [], "h": []}, {"identifier": "saves", "a": [{"value": 4, "element": 280}], "h": [{"value": 2, "element": 189}, {"value": 2, "element": 526}]}, {"identifier": "bonus", "a": [{"value": 1, "element": 278}], "h": [{"value": 3, "element": 188}, {"value": 2, "element": 191}]}, {"identifier": "bps", "a": [{"value": 32, "element": 278}, {"value": 19, "element": 280}, {"value": 18, "element": 273}, {"value": 16, "element": 274}, {"value": 16, "element": 283}, {"value": 15, "element": 276}, {"value": 12, "element": 286}, {"value": 11, "element": 290}, {"value": 10, "element": 287}, {"value": 3, "element": 434}, {"value": 2, "element": 277}, {"value": 1, "element": 285}, {"value": -3, "element": 288}], "h": [{"value": 46, "element": 188}, {"value": 40, "element": 191}, {"value": 27, "element": 183}, {"value": 26, "element": 187}, {"value": 24, "element": 182}, {"value": 18, "element": 197}, {"value": 15, "element": 181}, {"value": 12, "element": 198}, {"value": 11, "element": 199}, {"value": 10, "element": 184}, {"value": 7, "element": 189}, {"value": 7, "element": 526}, {"value": 3, "element": 192}, {"value": 3, "element": 200}]}]'::jsonb as j) q
) qq

;