如何在Postgres中使用JSON数据类型

简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用键值对的形式来表示数据,支持多种数据类型。JSON被广泛应用于Web应用程序中,用于数据的传输和存储。

JSON支持的数据类型

1.对象(Object): 对象在JSON中是被花括号{}包围着的一系列键值对的集合,键与值之间使用冒号:分隔,不同键值对之间使用逗号,分隔。

json 复制代码
{  
  "name": "John",  
  "age": 30,  
  "city": "New York"  
}

2.数组(Array) :数组在JSON中是用方括号[]包围着的一系列值的有序集合,值之间使用逗号,分隔。

json 复制代码
[  
  "apple",  
  "banana",  
  "cherry"  
]

3.字符串(String) :字符串必须被双引号""包围。

json 复制代码
"Hello, World!"

4.数值(Number) :JSON中的数值可以是整数或浮点数,不需要引号包围。

json 复制代码
42  
3.14159

5.布尔值(Boolean) :布尔值只有两种,truefalse,同样不需要引号包围。

json 复制代码
true  
false

6.null:null在JSON中表示一个空值或者不存在的对象。

json 复制代码
null

需要注意的是,JSON不支持JavaScript中的其他数据类型,比如函数或Date对象。如果需要在JSON中传递复杂的数据结构,比如日期,通常需要将其转换为字符串或数字,并在解析时将其转回原始数据类型。

JSON的这种简洁、清晰的格式使得它成为前后端数据交换的常用方式,尤其是在Web服务(如RESTful API)中,JSON是首选的数据格式。

JSON的特点

1、简洁和易读:JSON使用简洁的文本格式,易于阅读和编写;

3、可扩展性:支持多种数据类型,可以灵活地表示复杂的数据结构;

4、跨平台,JSON可以被多种编程语言支持和解析,可以在不同的平台间进行数据交换;

5、可嵌套性:值可以是一个对象,对象的值又可以是一个对象。

Postgres中json vs jsonb

Postgres支持存储和查询非结构化数据。Postgres支持两种存储json数据的数据类型:json(以字符串形式存储)和jsonb(以二进制形式存储)。尽管它们都用于存储 JSON 数据,但它们之间存在一些重要的差异。

对比项 json类型 jsonb类型
存储格式 以纯文本的形式存储JSON数据 二进制格式存储 JSON 数据
性能 插入数据速度更快对于复杂的查询(如搜索、比较或修改 JSON 结构中的数据),性能可能较差 在插入数据时 jsonb 可能比 json 稍慢一些;jsonb 支持索引,进行复杂查询、修改性能更优。
用途 简单地存储JSON格式的数据、不需要频繁修改JSON结构或进行复杂查询的场景,比如日志记录或某些不需要进行复杂处理的配置数据。 当你需要对 JSON 数据进行复杂查询、修改或验证时,jsonb 是更好的选择。例如,你可以使用 jsonb 来存储用户数据,并根据其中的特定字段进行查询或更新

使用教程

登录MemFire Cloud平台,创建一个应用,点击进入应用详情,找到SQL编辑器工具;

创建数据表

在这个例子中,id是一个自增的主键,titleauthorpublished_date是常规的文本和日期字段,而metadata是一个jsonb字段,用于存储书籍的元数据。

sql 复制代码
CREATE TABLE books (  
    id serial PRIMARY KEY,  
    title text NOT NULL,  
    author text NOT NULL,  
    published_date date NOT NULL,  
    metadata jsonb  
);

注意,我们使用::jsonb来将字符串转换为jsonb类型。

插入数据

你可以像插入任何其他数据一样插入JSON数据。数据必须是有效的JSON。

sql 复制代码
INSERT INTO books (title, author, published_date, metadata)  
VALUES (  
    'Effective PostgreSQL',  
    'Your Name Here',  
    '2023-01-01',  
    '{  
        "ISBN": "1234567890",  
        "publisher": "Your Publisher",  
        "pages": 300,  
        "language": "English"  
    }'::jsonb  
);

执行成功后,在编辑器可以查看结果:

查询数据

查询JSON数据与其他数据类似,有一些额外的特性可以访问嵌套值。Postgres支持一系列JSON函数和操作符。例如,->操作符将值作为jsonb数据返回。如果你想让数据作为text返回,使用->>操作符。

sql 复制代码
SELECT * FROM books WHERE metadata->>'ISBN' = '1234567890';

执行成功后,可以在SQL编辑器查看返回结果。

我们还可以使用更复杂的JSONB操作符和函数来执行更复杂的查询。例如,我们可以使用@>操作符来检查JSONB对象是否包含特定的键值对

sql 复制代码
SELECT * FROM books WHERE metadata @> '{"ISBN": "1234567890"}';

索引

为了提高查询性能,我们可以对jsonb字段创建GIN索引:

scss 复制代码
CREATE INDEX idxgin_metadata ON books USING gin(metadata);

这将大大提高涉及jsonb字段的查询性能。

更新数据

使用jsonb_set函数可以更新jsonb字段中的特定值:

sql 复制代码
UPDATE books  
SET metadata = jsonb_set(metadata, '{ISBN}', '"9876543210"')  
WHERE id = 1;

执行成功后,可以在SQL编辑器查看返回结果。

删除数据

要从jsonb字段中删除特定的键值对,可以使用jsonb_strip_nullsjsonb_set结合:

sql 复制代码
UPDATE books  
SET metadata = jsonb_strip_nulls(jsonb_set(metadata, '{some_key}', 'null'))  
WHERE id = 1;

这会将ID为1的书籍的some_keymetadata中删除。

通过这些步骤,您可以在PostgreSQL中使用jsonb数据类型来存储和管理书籍的元数据。

验证 * JSON *数据

MemFire Cloud新发布版本中提供了根据JSON Schema文档验证jsonjsonb数据类型的能力。在数据库->扩展页面,输入框内搜索json,找到扩展pg_jsonschema,点击启用,如下图所示。

现在,你可以向表中添加一个"检查约束",以验证JSON数据:

sql 复制代码
create table customers (
    id serial primary key,
    metadata json
);
alter table customers
add constraint check_metadata check (
    json_matches_schema(
        '{
            "type": "object",
            "properties": {
                "tags": {
                    "type": "array",
                    "items": {
                        "type": "string",
                        "maxLength": 16
                    }
                }
            }
        }',
        metadata
    )
);

参考资源

相关推荐
ZKY_247 小时前
【工具】Json在线解析工具
unity·json
JhonKI10 小时前
从零实现Json-Rpc框架】- 项目实现 - 服务端registry&discovery实现
网络协议·rpc·json
东方佑17 小时前
使用Python解析PPT文件并生成JSON结构详解
python·json·powerpoint
inxunoffice20 小时前
批量修改记事本文本文件编码,可以解决文本文件乱码问题
json
cherry523021 小时前
【PostgreSQL】【第4章】PostgreSQL的事务
数据库·postgresql
Kaede61 天前
怎么安装JSON服务器?JSON服务器最新安装教程
运维·服务器·json
还是鼠鼠1 天前
Node.js Express 处理静态资源
前端·javascript·vscode·node.js·json·express
库海无涯2 天前
如何把数据从SQLite迁移到PostgreSQL
数据库·postgresql·sqlite
witton2 天前
MinGW下编译ffmpeg源码时生成compile_commands.json
ffmpeg·json·makefile·mingw·调试·compile_command·remake
cherry52302 天前
【PostgreSQL】【第3章】PostgreSQL的对象操作
数据库·postgresql