【问题标题】:problem inserting json array into postgres: malformed error将json数组插入postgres的问题:格式错误
【发布时间】:2021-12-02 05:40:46
【问题描述】:

我正在尝试将一组 JSON 值插入到 postgres 数据库中。但我收到了这个错误:

error: malformed array literal: "{{"traits":{"belief":[],"personality":[],"physical":[]},"relationships":[]},{"traits":{"belief":[],"personality":[],"physical":[]},"relationships":[]}}"

如果我是正确的,数组字面量应该采用"{{...},{...}}" 的形式。据我所知,这是将 JSON 元素数组插入 postgres 表的正确方法。

如果有帮助,这是我的整个查询:

INSERT INTO main(prev_snippets, next_snippets, req_characters, description, requirements, prereq_events, character_effects, world_effects, character_decisions)
        VALUES ('{"22","45","99"}', '{"33","22"}', '{{"traits":{"belief":[],"personality":[],"physical":[]},"relationships":[]},{"traits":{"belief":[],"personality":[],"physical":[]},"relationships":[]}}', 'cvdfgfg', NULL, NULL, NULL, NULL, NULL);

prev_snippetsnext_snippets 是整数数组(当我弄清楚 JSON 问题时,我将使用这些整数而不是字符串),req_characters 是 JSONB 数组,description 是文本。

请告诉我如何才能使我的问题变得更好。非常感谢您的帮助。

更新:

这是表定义:

CREATE TABLE main (
  id SERIAL NOT NULL UNIQUE,
  PRIMARY KEY(id),
  prev_snippets INTEGER[],
  next_snippets INTEGER[],
  req_characters JSONB[],
  description TEXT NOT NULL,
  requirements JSONB[],
  prereq_events JSONB[],
  character_effects JSONB[],
  world_effects JSONB[],
  character_decisions JSONB[]
);

我相信我使用的是 postgres 版本 14。

【问题讨论】:

  • 什么版本的 Postgres,请问?
  • 在您的问题中添加表定义,特别是列的实际声明类型。
  • 您对所有数组数据类型是否 100% 确定?这通常是一个糟糕的数据库设计
  • @FrankHeikens 好点。根据此处的建议,我将所有 JSONB 数组列更改为 JSONB 列,因为它是多余的。我也可能会切换到 Mongo DB,因为这开始看起来不像是关系数据库用例了。

标签: arrays postgresql


【解决方案1】:

您将 JSONB 与 Postgres 数组混为一谈。

req_characters JSONB[] 是 JSONB 值的 Postgres 数组。这将类似于...

array['{"traits":...}','{"traits":...}'].

在 Postgres 数组中嵌入 JSON 是不必要的复杂。 JSON 已经有数组。在 JSON 中,{} 是一个键/值对象。 [] 是一个元素数组。

不要使用jsonb[],只需使用jsonb 并传递一个JSON 数组。

'[{"traits":...}, {"traits":...}]'.

大多数语言都有将数据转换为 JSON 的内置工具。这比在 Postgres 数组中嵌入 JSON 要简单得多。请参阅JSON.org 了解更多信息。


出于同样的原因,我建议将所有其他数组更改为简单的 JSONB。

另请注意,数组和 JSON 不能替代 join tables。你所有的数组都可以作为连接表更好地完成。

【讨论】:

  • 也许我误解了你的答案——我正在尝试创建一个 JSON 元素数组。所以外层{}是表示一个数组,第二层{}是表示一个JSON元素。
  • @StLouis9 我刚刚发现你已经声明了它jsonb[] 而不是jsonb。请参阅我的更新答案。
【解决方案2】:

使用 Postgres array 执行此操作的最简单方法可能是:

insert into array_test 
 (jsonb_array) 
values 
(ARRAY['{"traits":{"belief":[],"personality":[],"physical":[]},"relationships":[]}'::jsonb, 
'{"traits":{"belief":[],"personality":[],"physical":[]},"relationships":[]}'::jsonb]);

select jsonb_array[1] from array_test ;
                                    jsonb_array                                     
------------------------------------------------------------------------------------
 {"traits": {"belief": [], "physical": [], "personality": []}, "relationships": []}


虽然如果它在我那里我只会使用 jsonb 字段而不是 jsonb 元素的 Postgres array

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多