【问题标题】:Get key and value from unstructured JSON data从非结构化 JSON 数据中获取键和值
【发布时间】:2021-04-23 07:33:18
【问题描述】:

我有下表中的一些数据:

表:

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 postgresql postgresql-11


    【解决方案1】:

    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 |
    +--+-------+-----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-19
      • 2016-08-19
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      相关资源
      最近更新 更多