笔记——PostgreSQL操作JSON数据

前言


PostgreSQL提供了两种存储JSON数据的类型:json和jsonb;

  • jsonb是json的二进制形式。
  • json格式写入快,但读取慢;
  • jsonb格式写入慢,但读取快;

常用语法


 // -> 返回json
 select '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2 // 输出 {"c":"baz"}
 select '{"a": {"b":"foo"}, "c":{"a": "aaa"}}'::json->'a' // 输出 {"b":"foo"}
 
 // ->> 返回文本
 select '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->>2 // 输出 {"c":"baz"}
 select '{"a": {"b":"foo"}, "c":{"a": "aaa"}}'::json->>'a' // 输出 {"b":"foo"}

 // #> 获取json子对象
 select '{"a": {"b":{"c": "foo"}}}'::json#> '{a,b}' // 输出 {"c": "foo"}
 select '{"a": {"b":{"c": "foo"}}}'::json#>> '{a,b}' // 输出 {"c": "foo"}

 // @> ———— 判断第一个json是否包含第二个
 select '{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb   //输出t
 // <@ ———— 判断第一个json是否在第一个中
 select '{"b":2}'::jsonb <@ '{"a":1, "b":2}'::jsonb   //输出t

常用操作符


json&jsonb右操作数据类型备注
->int获取json数组的元素
->text通过key值获取json对象字段
->>int获取json数组元素为字符串
->>text获取json对象字段为字符串
#>text[ ]在指定路径下获取json对象
#>>text[ ]在指定路径下获得json对象为字符串
jsonb右操作数据类型备注
@>jsonb在顶层,左边的json值包含右边的json值
<@jsonb在顶层,右边的json值包含左边的json值
lljsonb将两个jsonb值连接成一个新jsonb值

实例操作


数据库表(test_pgsql):

在这里插入图片描述
第一条data为json类型的数组:

[
	{
	    "username": "张三",
	    "age": "18",
	    "sex": "男"
	  },
	{
	    "username": "张三",
	    "age": "25",
	    "sex": "男"
	  },
	{
	    "username": "马冬梅",
	    "age": "20",
	    "sex": "女"
	  }
]

第二条data内容为json类型的对象:

{
    "course":[
        {
            "id":"1",
            "course":"语文",
            "score":"75"
        },
        {
            "id":"2",
            "course":"数学",
            "score":"100"
        }
    ],
    "student":{
        "name":"小王",
        "age":"22"
    }
}
1、查询数组的长度:
// 结果为4
select jsonb_array_length(t."data"::jsonb) from test_pgsql t WHERE t.id = 1;
2、查询数组中第二个元素
//数组索引从0开始,结果为{"age": "25", "sex": "男", "username": "张三"}
select t."data"::jsonb->>1 from test_pgsql t WHERE t.id = 1;
3、查询data中所有的username

select json_array_elements(t."data"::json) #> '{username}' as guid from test_pgsql t where t."id" = 1;

//username去重
select distinct guid|| '' from (select json_array_elements(t."data"::json) #> '{username}' as guid from test_pgsql t where t."id" = 1) tmp;

结果:
在这里插入图片描述

4、json_object_keys 用法
  • 说明:json_object_keys 不能用于纯数组
//获取json中的键
select json_object_keys(t."data"::json) from test_pgsql t where id = 2;

结果:
在这里插入图片描述

5、json_array_elements 用法
//json_array_elements用于提取转换纯数组元素,将数组拆分为单独记录
select json_array_elements(t."data"::json) from test_pgsql t WHERE t.id = 1;

结果:
在这里插入图片描述

6、json_extract_path 用法
  • 说明:json_extract_path不能直接操作纯数组
//查询json中指定键(student)的值,结果为 {"name": "小王", "age": "22"}
select json_extract_path(t."data"::json, 'student') from test_pgsql t where id = 2;
//结果为 "小王"
select json_extract_path(t."data"::json, 'student','name') from test_pgsql t where id = 2;

//和 #>操作符 是一样的
select t."data"::json #>'{student}' from test_pgsql t where id = 2;
select t."data"::json #>'{student,name}' from test_pgsql t where id = 2;
  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于使用Spring Boot和PostgreSQL存储和操作JSON格式数据的问题,您可以按照以下步骤进行操作: 1. 首先,在您的Spring Boot项目中添加PostgreSQL的依赖。您可以在Maven或Gradle配置文件中添加以下依赖项: ```xml <!-- Maven --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>版本号</version> </dependency> ``` ```groovy // Gradle implementation 'org.postgresql:postgresql:版本号' ``` 2. 确保您已经在PostgreSQL数据库中创建了一个表,该表包含一个JSON类型的列用于存储JSON数据。您可以使用以下DDL语句创建一个表: ```sql CREATE TABLE your_table ( id SERIAL PRIMARY KEY, json_data JSON ); ``` 3. 在您的Spring Boot应用程序中,您可以使用JPA(Java Persistence API)或Spring Data JDBC来访问和操作数据库。 - 如果您选择使用JPA,您需要创建一个实体类来映射到数据库表。在实体类中,您可以使用`@Column(columnDefinition = "json")`注解来指定该字段应该使用JSON数据类型。例如: ```java @Entity @Table(name = "your_table") public class YourEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(columnDefinition = "json") private String jsonData; // Getters and setters } ``` - 如果您选择使用Spring Data JDBC,您可以创建一个简单的POJO类,其中包含一个与数据库表列对应的字段。例如: ```java public class YourEntity { private Long id; private String jsonData; // Getters and setters } ``` 4. 在您的应用程序中,您可以使用JPA的Repository接口或Spring Data JDBC的Repository接口来执行数据操作。例如,使用JPA的Repository接口: ```java public interface YourRepository extends JpaRepository<YourEntity, Long> { } ``` 5. 现在,您可以在您的业务逻辑中使用Repository接口来存储和检索JSON数据。例如,使用JPA的Repository接口: ```java @Service public class YourService { private final YourRepository yourRepository; public YourService(YourRepository yourRepository) { this.yourRepository = yourRepository; } public void saveJsonData(String jsonData) { YourEntity entity = new YourEntity(); entity.setJsonData(jsonData); yourRepository.save(entity); } public List<YourEntity> getAllEntities() { return yourRepository.findAll(); } } ``` 这样,您就可以使用Spring Boot和PostgreSQL来存储和操作JSON格式数据了。希望对您有所帮助!如有任何疑问,请随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值