Files
akmon/JSON_SYNTAX_FIX.md
2026-01-20 08:04:15 +08:00

127 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# JSON 语法错误修复
## 问题描述
在执行模拟数据插入时遇到 PostgreSQL JSON 语法错误:
```
ERROR: 22P02: invalid input syntax for type json
LINE 252: WHEN 'share' THEN '{"platform": "weibo", "shared_at": "' || NOW() || '"}'::jsonb
DETAIL: Token ""}" is invalid.
CONTEXT: JSON data, line 1: "}
```
## 问题根源
错误发生在用户交互数据插入的 CASE 语句中,尝试通过字符串拼接来构建包含时间戳的 JSON
### 问题代码
```sql
CASE interaction_type
WHEN 'share' THEN '{"platform": "weibo", "shared_at": "' || NOW() || '"}'::jsonb
WHEN 'favorite' THEN '{"folder": "我的收藏", "added_at": "' || NOW() || '"}'::jsonb
ELSE '{}'::jsonb
END
```
### 问题分析
1. **时间戳格式问题**: `NOW()` 返回的时间戳格式可能包含特殊字符
2. **JSON 转义问题**: 直接字符串拼接没有正确处理 JSON 转义
3. **语法错误**: 生成的字符串不是有效的 JSON 格式
## 解决方案
使用 PostgreSQL 的 `jsonb_build_object()` 函数来安全地构建 JSONB 对象:
### 修复后的代码
```sql
CASE interaction_type
WHEN 'share' THEN jsonb_build_object('platform', 'weibo', 'shared_at', NOW())
WHEN 'favorite' THEN jsonb_build_object('folder', '我的收藏', 'added_at', NOW())
ELSE '{}'::jsonb
END
```
## 技术优势
### 使用 `jsonb_build_object()` 的优势:
1. **自动转义**: 函数会自动处理 JSON 中的特殊字符和转义
2. **类型安全**: 正确处理不同数据类型(字符串、时间戳等)
3. **语法保证**: 生成的始终是有效的 JSONB 格式
4. **性能优化**: 原生函数比字符串拼接更高效
### 修复前后对比
**修复前(❌ 错误):**
```sql
-- 字符串拼接方式,容易出错
'{"platform": "weibo", "shared_at": "' || NOW() || '"}'::jsonb
```
**修复后(✅ 正确):**
```sql
-- 使用专用函数,安全可靠
jsonb_build_object('platform', 'weibo', 'shared_at', NOW())
```
## 生成的数据示例
修复后,`interaction_data` 字段将包含正确格式的 JSONB 数据:
**分享数据:**
```json
{
"platform": "weibo",
"shared_at": "2025-07-07T10:30:45.123Z"
}
```
**收藏数据:**
```json
{
"folder": "我的收藏",
"added_at": "2025-07-07T10:30:45.123Z"
}
```
## PostgreSQL JSONB 函数说明
### `jsonb_build_object()`
- **语法**: `jsonb_build_object(key1, value1, key2, value2, ...)`
- **功能**: 从键值对列表构建 JSONB 对象
- **优势**: 自动处理类型转换和 JSON 转义
### 其他相关函数
- `jsonb_build_array()`: 构建 JSONB 数组
- `to_jsonb()`: 将任意值转换为 JSONB
- `jsonb_set()`: 设置 JSONB 对象中的值
## 最佳实践
1. **避免字符串拼接**: 不要用 `||` 操作符拼接 JSON 字符串
2. **使用原生函数**: 优先使用 PostgreSQL 的 JSONB 函数
3. **处理特殊字符**: 让数据库自动处理转义和特殊字符
4. **类型安全**: 让函数处理不同数据类型的转换
## 验证结果
-**SQL 语法检查**: 通过 PostgreSQL 语法验证
-**JSON 格式**: 生成有效的 JSONB 数据
-**时间戳处理**: 正确处理 NOW() 函数返回值
-**中文支持**: 正确处理中文字符
## 相关资源
- [PostgreSQL JSONB 函数文档](https://www.postgresql.org/docs/current/functions-json.html)
- [JSONB vs JSON 性能对比](https://www.postgresql.org/docs/current/datatype-json.html)
- [JSON 数据类型最佳实践](https://www.postgresql.org/docs/current/json-faq.html)
## 文件状态
- **文件**: `h:\blews\akmon\video_system_database.sql`
- **修复行数**: 第 990-995 行
- **状态**: ✅ 已修复JSON 语法正确
- **更新时间**: 2025-07-07
---
*JSON 字符串拼接问题已成功修复,现在使用 PostgreSQL 原生 JSONB 函数来安全构建 JSON 数据。*