从非结构化 JSON 数据中获取键和值

问题描述

我有下表和一些数据:

表格:

create table tbl_jsontest
(
   id int,jdata json 
);

记录:

insert into tbl_jsontest values(1,'{"Id":1,"Name":"Jack"}');
insert into tbl_jsontest values(1,'[{"Id":2,"Name":"Mak"},{"Name":"Aez","Address":"ZX"}]');
insert into tbl_jsontest values(1,'[{"Id":5,"Name":"Lee"}]');

查询

SELECT json_data.key AS key1,json_data.value AS value1
FROM tbl_jsontest,json_each_text(tbl_jsontest.jdata) AS json_data;

出现错误

错误:无法将数组解构为对象

解决方法

json_each_text 函数接受一个 json 对象作为输入,并且不适用于数组。

文档https://www.postgresql.org/docs/current/functions-json.html

json_each_text ( json ) → setof record ( key text,value text ) 将顶级 JSON 对象扩展为一组键/值对。返回的值将是文本类型。

可以先用json_array_elements展开数组,然后展开对象

你也应该将 jdata 重新格式化为相同的格式

记录:

insert into tbl_jsontest values(1,'[{"Id":1,"Name":"Jack"}]');
insert into tbl_jsontest values(1,'[{"Id":2,"Name":"Mak"},{"Name":"Aez","Address":"ZX"}]');
insert into tbl_jsontest values(1,'[{"Id":5,"Name":"Lee"}]');

查询:

select t.id,key,value
from (SELECT id,json_array_elements(tbl_jsontest.jdata) d
      FROM tbl_jsontest) t,json_each_text(t.d);

结果:

+--+-------+-----+
|id|key    |value|
+--+-------+-----+
|1 |Id     |2    |
|1 |Name   |Mak  |
|1 |Name   |Aez  |
|1 |Address|ZX   |
|1 |Id     |5    |
|1 |Name   |Lee  |
|1 |Id     |1    |
|1 |Name   |Jack |
+--+-------+-----+

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...