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

从非结构化JSON数据中获取键和值,json,postgresql,postgresql-11,Json,Postgresql,Postgresql 11,我有下表和一些数据: 表: 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&qu

我有下表和一些数据:

表:

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"}]');
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;
select t.id, key, value
from (SELECT id, json_array_elements(tbl_jsontest.jdata) d
      FROM tbl_jsontest) t,
     json_each_text(t.d);
获取错误:

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


json_each_文本函数将json对象作为输入,不使用数组

文件

json\u每个文本(json)→ 记录集(键文本、值文本)
将顶级JSON对象扩展为一组键/值对。返回的值将是文本类型

您可以首先使用
json\u array\u元素
展开数组,然后展开对象

您还应该将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"}]');
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;
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 |
+--+-------+-----+

json_each_文本函数将json对象作为输入,不使用数组

文件

json\u每个文本(json)→ 记录集(键文本、值文本)
将顶级JSON对象扩展为一组键/值对。返回的值将是文本类型

您可以首先使用
json\u array\u元素
展开数组,然后展开对象

您还应该将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"}]');
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;
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 |
+--+-------+-----+