JSON 和 JSONB 的区别

JSON 和 JSONB 的区别

存储方式:

  • JSON: 以纯文本格式存储数据。每次读取数据时,需要进行文本解析。
  • JSONB: 以二进制格式存储数据。在写入时进行解析并优化数据格式,读取时无需再次解析。

性能:

  • JSON: 由于是纯文本存储,每次读取时需要解析文本,读取性能较低。但写入性能较高,因为不需要额外的转换。
  • JSONB: 由于以二进制格式存储,读取性能较高,适合频繁的读取操作。写入时需要转换为二进制格式,写入性能可能略低。

灵活性:

  • JSON: 非常灵活,适用于写操作频繁但读操作不频繁的场景。
  • JSONB: 适用于读操作频繁、需要高效查询和复杂操作的场景。

功能:

  • JSON: 支持基本的 JSON 操作,如插入、删除和简单查询,但不支持高级操作。
  • JSONB: 支持更多高级操作,如索引、函数和操作符,可以更高效地进行复杂查询。

JSON 示例

使用 Jackson 库处理 JSON 数据。

Maven 依赖

xml 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

Java 代码

java 复制代码
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonExample {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();
        
        // 创建 Java 对象
        User user = new User(1, "Alice", "alice@example.com");

        try {
            // 将 Java 对象转换为 JSON 字符串
            String jsonString = objectMapper.writeValueAsString(user);
            System.out.println("JSON String: " + jsonString);

            // 将 JSON 字符串解析为 Java 对象
            User parsedUser = objectMapper.readValue(jsonString, User.class);
            System.out.println("Parsed User: " + parsedUser);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class User {
    private int id;
    private String name;
    private String email;

    // 构造函数、getter 和 setter

    public User(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // toString 方法
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }

    // getters and setters
}

JSONB 示例

虽然 JSONB 是一种二进制格式,但在 Java 中,我们通常不会直接处理 JSONB 数据。相反,我们会使用类似于 Jackson 的库来序列化和反序列化 JSON 数据,并依赖于数据库(例如 PostgreSQL)处理 JSONB 数据存储。

示例:将 JSON 数据存储到 PostgreSQL JSONB 列

sql 复制代码
-- 创建表,包含 JSONB 列
CREATE TABLE example_jsonb (
    id SERIAL PRIMARY KEY,
    data JSONB
);

-- 插入 JSONB 数据
INSERT INTO example_jsonb (data) VALUES ('{"name": "Alice", "age": 30}');

Java 代码

java 复制代码
import com.fasterxml.jackson.databind.ObjectMapper;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JsonbExample {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();
        String url = "jdbc:postgresql://localhost:5432/mydatabase";
        String user = "myuser";
        String password = "mypassword";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            // 创建 Java 对象
            User userObj = new User(2, "Bob", "bob@example.com");
            String jsonString = objectMapper.writeValueAsString(userObj);

            // 插入 JSONB 数据到 PostgreSQL
            String insertSql = "INSERT INTO example_jsonb (data) VALUES (?::jsonb)";
            try (PreparedStatement pstmt = conn.prepareStatement(insertSql)) {
                pstmt.setString(1, jsonString);
                pstmt.executeUpdate();
            }

            // 查询 JSONB 数据
            String selectSql = "SELECT data FROM example_jsonb WHERE id = ?";
            try (PreparedStatement pstmt = conn.prepareStatement(selectSql)) {
                pstmt.setInt(1, 2);
                try (ResultSet rs = pstmt.executeQuery()) {
                    if (rs.next()) {
                        String data = rs.getString("data");
                        User retrievedUser = objectMapper.readValue(data, User.class);
                        System.out.println("Retrieved User: " + retrievedUser);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结

  • JSON 适合更灵活的数据存储和简单查询,适用于写操作频繁但读操作不频繁的场景。
  • JSONB 适合需要高效查询和索引的数据存储,适用于读操作频繁、需要高效查询和复杂操作的场景。

在 Java 中,可以使用 Jackson 等库来处理 JSON 数据,并通过数据库(如 PostgreSQL)来存储和查询 JSONB 数据。

相关推荐
消失的旧时光-194326 分钟前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解
追风筝的人er1 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
前端·vue.js·后端
金銀銅鐵2 小时前
[git] 如何丢弃对一个文件的改动?
git·后端
橘子海全栈攻城狮2 小时前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
smallyoung3 小时前
具有反思能力的 Agentic RAG 实战:用 LangChain4j 实现 CRAG 纠错检索
人工智能·后端
EthanYuan3 小时前
💡RAG实践:从云知识库迁移到PostgreSQL ,并使用PGVector实现向量存储
后端
直奔標竿3 小时前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
等风来_shy4 小时前
如何写好一个 Skill
后端
ailab4 小时前
研发人员如何写好 AI 提示词:从“问问题”到“驱动研发闭环”
后端
ltl4 小时前
【大模型基础设施工程】25:大模型基础设施未来
后端