# idea-plugin-jsonutilities **Repository Path**: BigDeng_Hh/idea-plugin-jsonutils ## Basic Information - **Project Name**: idea-plugin-jsonutilities - **Description**: 一个功能强大的 IntelliJ IDEA 插件,专门用于处理混乱、转义或格式错误的 JSON 字符串。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-21 - **Last Updated**: 2025-10-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JSON Utilities - 强大的 JSON 处理工具 一个功能强大的 IntelliJ IDEA 插件,专门用于处理混乱、转义或格式错误的 JSON 字符串。 ## ✨ 主要功能 ### 🎯 核心功能 1. **智能格式化** - 自动美化和格式化 JSON - 支持自定义缩进 - 自动修复常见格式错误 2. **JSON 清理与修复** - 自动修复单引号为双引号 - 移除尾部逗号 - 移除注释(单行和多行) - 去除 BOM 标记 - 移除前后的垃圾字符 3. **转义处理** - 解转义嵌套的 JSON 字符串 - 支持多层转义 - 转义 JSON(用于日志等场景) 4. **编码支持** - 自动识别并解码 URL 编码的 JSON - 自动识别并解码 Base64 编码的 JSON 5. **格式转换** ⭐ 新功能 - JSON ⇌ YAML 互转 - JSON ⇌ Properties 互转 - 保持数据结构完整 6. **代码生成** ⭐ 新功能 - JSON 转 Java 实体类 - 自动生成 Getter/Setter - 支持嵌套类和集合 7. **JSONPath 查询** ⭐ 新功能 - 快速定位和提取 JSON 数据 - 支持复杂查询表达式 - 提供常用示例 8. **JWT 支持** ⭐ 新功能 - JWT Token 解码和解析 - 从 JSON 生成 JWT - 支持验证和过期时间设置 9. **SQL 转换** ⭐ 新功能 - JSON 转 SQL INSERT 语句 - JSON 转 CREATE TABLE 语句 - SQL INSERT 转 JSON 10. **树形可视化** - 直观的树形结构展示 JSON - 支持展开/折叠 - 清晰显示数据类型 ### 🚀 操作方式 #### 1. 编辑器右键菜单(推荐) - 选中 JSON 文本 - 右键打开菜单 - 选择"JSON Utilities"下的相关操作: - **格式化 JSON** - 美化 JSON - **压缩 JSON** - 压缩为单行 - **解转义 JSON** - 解除转义 - **转义 JSON** - 转义字符串 - **JSON 转 Java 实体类** ⭐ - 生成 Java 代码 - **JSON 转 YAML** ⭐ - 格式转换 - **YAML 转 JSON** ⭐ - 格式转换 - **JSON 转 Properties** ⭐ - 格式转换 - **Properties 转 JSON** ⭐ - 格式转换 - **JSONPath 查询** ⭐ - 数据查询 - **JWT 解码** ⭐ - JWT Token 解析 - **生成 JWT** ⭐ - 从 JSON 生成 JWT - **JSON 转 SQL INSERT** ⭐ - 生成 SQL 语句 - **JSON 转 CREATE TABLE** ⭐ - 生成建表语句 - **SQL INSERT 转 JSON** ⭐ - SQL 转 JSON #### 2. 工具窗口 - 在右侧工具栏找到"JSON Utilities" - 在输入框中粘贴 JSON - 点击相应按钮进行处理 - 查看树形视图了解 JSON 结构 #### 3. 智能提示(Intention Actions) - 选中包含 JSON 的文本 - 按 `Alt + Enter`(Windows/Linux)或 `⌥ + ⏎`(Mac) - 选择建议的 JSON 操作 --- ## 📦 安装 ### 从源码构建 ```bash # 克隆仓库 git clone cd json-util # 构建插件 ./gradlew buildPlugin # 插件文件位于 build/distributions/ ``` ### 手动安装 1. 打开 IntelliJ IDEA 2. 进入 `Settings/Preferences` → `Plugins` 3. 点击齿轮图标 → `Install Plugin from Disk...` 4. 选择构建好的 `.zip` 文件 5. 重启 IDE --- ## 📖 使用示例 ### 基础格式化 #### 示例 1: 格式化压缩的 JSON **输入:** ```json {"name":"Alice","age":25,"address":{"city":"Shanghai","country":"China"},"hobbies":["reading","coding"]} ``` **操作:** 选中文本 → 右键 → JSON Utilities → 格式化 JSON **输出:** ```json { "name": "Alice", "age": 25, "address": { "city": "Shanghai", "country": "China" }, "hobbies": [ "reading", "coding" ] } ``` #### 示例 2: 压缩格式化的 JSON **输入:** ```json { "product": "Laptop", "price": 999.99, "inStock": true } ``` **操作:** 选中文本 → 右键 → JSON Utilities → 压缩 JSON **输出:** ```json {"product":"Laptop","price":999.99,"inStock":true} ``` --- ### 处理转义 JSON #### 示例 3: 单层转义 **输入:** ``` "{\"username\":\"john_doe\",\"email\":\"john@example.com\"}" ``` **操作:** 选中文本 → 右键 → JSON Utilities → 解转义 JSON **输出:** ```json {"username":"john_doe","email":"john@example.com"} ``` #### 示例 4: 多层嵌套转义 **输入:** ``` "{\"data\":\"{\\\"nested\\\":{\\\"value\\\":\\\"test\\\"}}\",\"status\":\"ok\"}" ``` **操作:** 选中文本 → 右键 → JSON Utilities → 解转义 JSON **输出:** ```json {"data":"{\"nested\":{\"value\":\"test\"}}","status":"ok"} ``` 再次执行可继续解转义内层 JSON。 #### 示例 5: 转义 JSON(用于日志) **输入:** ```json {"message":"Error occurred","details":{"code":500}} ``` **操作:** 选中文本 → 右键 → JSON Utilities → 转义 JSON **输出:** ``` "{\"message\":\"Error occurred\",\"details\":{\"code\":500}}" ``` --- ### 清理混乱的 JSON #### 示例 6: 修复单引号 **输入:** ```javascript {'name': 'Bob', 'active': true, 'score': 95.5} ``` **操作:** 选中文本 → 右键 → JSON Utilities → 格式化 JSON **输出:** ```json { "name": "Bob", "active": true, "score": 95.5 } ``` #### 示例 7: 移除尾部逗号 **输入:** ```json { "items": ["apple", "banana", "orange",], "count": 3, } ``` **操作:** 选中文本 → 右键 → JSON Utilities → 格式化 JSON **输出:** ```json { "items": [ "apple", "banana", "orange" ], "count": 3 } ``` #### 示例 8: 移除注释 **输入:** ```javascript { // 用户信息 "name": "Charlie", "age": 30, // 年龄 /* * 联系方式 */ "email": "charlie@example.com" } ``` **操作:** 选中文本 → 右键 → JSON Utilities → 格式化 JSON **输出:** ```json { "name": "Charlie", "age": 30, "email": "charlie@example.com" } ``` #### 示例 9: 清理带垃圾字符的 JSON **输入:** ``` Error: Invalid response: {"status":"success","data":{"id":123}} ``` **操作:** 选中文本 → 右键 → JSON Utilities → 格式化 JSON **输出:** ```json { "status": "success", "data": { "id": 123 } } ``` --- ### 处理编码的 JSON #### 示例 10: URL 编码的 JSON **输入:** ``` %7B%22query%22%3A%22search%20term%22%2C%22page%22%3A1%7D ``` **操作:** 选中文本 → 右键 → JSON Utilities → 格式化 JSON **输出:** ```json { "query": "search term", "page": 1 } ``` #### 示例 11: Base64 编码的 JSON **输入:** ``` eyJuYW1lIjoiRGF2aWQiLCJyb2xlIjoiYWRtaW4ifQ== ``` **操作:** 选中文本 → 右键 → JSON Utilities → 格式化 JSON **输出:** ```json { "name": "David", "role": "admin" } ``` --- ### 使用工具窗口 #### 示例 12: 批量处理 JSON 1. 打开右侧的 "JSON Utilities" 工具窗口 2. 在"输入 JSON"区域粘贴以下内容: ``` "{\"users\":[{\"id\":1,\"name\":\"Alice\"},{\"id\":2,\"name\":\"Bob\"}]}" ``` 3. 点击"解转义"按钮 4. 再点击"格式化"按钮 5. 查看"输出结果"区域和下方的"树形视图" **结果:** - 输出区域显示格式化的 JSON - 树形视图显示结构化的数据 ``` root: { } └─ users: [ ] ├─ [0]: { } │ ├─ id: 1 │ └─ name: "Alice" └─ [1]: { } ├─ id: 2 └─ name: "Bob" ``` --- ### JSON 转 Java 实体类 #### 示例 13: 生成 Java 实体类 **输入:** ```json { "name": "John Doe", "age": 30, "email": "john@example.com", "address": { "city": "Beijing", "country": "China" } } ``` **操作:** 选中文本 → 右键 → JSON Utilities → JSON 转 Java 实体类 → 输入类名 "User" **输出:** ```java // Generated from JSON import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = 1L; private String name; private Integer age; private String email; private Address address; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } } public class Address implements Serializable { private static final long serialVersionUID = 1L; private String city; private String country; public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } } ``` --- ### JSON 格式转换 #### 示例 14: JSON 转 YAML **输入:** ```json { "server": { "host": "localhost", "port": 8080 }, "database": { "url": "jdbc:mysql://localhost:3306/db", "username": "root" } } ``` **操作:** 选中文本 → 右键 → JSON Utilities → JSON 转 YAML **输出:** ```yaml server: host: localhost port: 8080 database: url: jdbc:mysql://localhost:3306/db username: root ``` #### 示例 15: JSON 转 Properties **输入:** ```json { "app": { "name": "MyApp", "version": "1.0.0" }, "server": { "port": 8080 } } ``` **操作:** 选中文本 → 右键 → JSON Utilities → JSON 转 Properties **输出:** ```properties #Generated from JSON app.name=MyApp app.version=1.0.0 server.port=8080 ``` --- ### JSONPath 查询 #### 示例 16: 使用 JSONPath 查询数据 **输入:** ```json { "store": { "book": [ { "category": "fiction", "author": "张三", "title": "小说A", "price": 8.95 }, { "category": "fiction", "author": "李四", "title": "小说B", "price": 12.99 } ] } } ``` **操作:** 选中文本 → 右键 → JSON Utilities → JSONPath 查询 在弹出的对话框中输入 JSONPath 表达式: - `$.store.book[*].author` - 获取所有作者 - `$.store.book[?(@.price < 10)]` - 获取价格小于10的书 - `$.store.book[0].title` - 获取第一本书的标题 --- ### JWT 操作 #### 示例 17: JWT 解码 **输入 (JWT Token):** ``` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` **操作:** 选中 Token → 右键 → JSON Utilities → JWT 解码 **输出:** ``` === JWT Header === { "alg": "HS256", "typ": "JWT" } === JWT Payload === { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } === Decoded Claims === sub: 1234567890 name: John Doe iat (Issued At): Mon Jan 18 02:30:22 CST 2018 ``` #### 示例 18: 生成 JWT **输入 (JSON Payload):** ```json { "userId": 12345, "username": "john_doe", "role": "admin" } ``` **操作:** 选中 JSON → 右键 → JSON Utilities → 生成 JWT → 输入密钥: `your-secret-key` → 输入过期时间(分钟): `60` **输出:** JWT Token 字符串 --- ### SQL 转换 #### 示例 19: JSON 转 SQL INSERT **输入:** ```json { "id": 1, "name": "张三", "age": 28, "email": "zhangsan@example.com" } ``` **操作:** 选中 JSON → 右键 → JSON Utilities → JSON 转 SQL INSERT → 输入表名: `users` **输出:** ```sql INSERT INTO users (id, name, age, email) VALUES (1, '张三', 28, 'zhangsan@example.com'); ``` #### 示例 20: JSON 转 CREATE TABLE **输入:** ```json { "id": 1, "username": "admin", "email": "admin@example.com", "age": 30, "is_active": true, "created_at": "2024-01-01" } ``` **操作:** 选中 JSON → 右键 → JSON Utilities → JSON 转 CREATE TABLE → 输入表名: `users` **输出:** ```sql CREATE TABLE users ( id INT, username VARCHAR(255), email VARCHAR(255), age INT, is_active BOOLEAN, created_at VARCHAR(255) ); ``` #### 示例 21: SQL INSERT 转 JSON **输入:** ```sql INSERT INTO users (id, name, email) VALUES (1, 'Alice', 'alice@example.com'); ``` **操作:** 选中 SQL → 右键 → JSON Utilities → SQL INSERT 转 JSON **输出:** ```json { "id": 1, "name": "Alice", "email": "alice@example.com" } ``` --- ## 💡 常见问题解决 ### 问题 1: 日志中的 JSON **场景:** 从日志文件复制的 JSON,包含时间戳和其他信息 **输入:** ``` 2024-01-15 10:30:45 [INFO] Response: {"status":"ok","timestamp":1705294245} ``` **解决:** 选中包含 JSON 的部分 → 格式化 JSON 插件会自动提取 `{...}` 部分 ### 问题 2: API 响应中的转义 JSON **场景:** API 返回的数据中,某个字段是转义的 JSON 字符串 **输入:** ```json { "code": 200, "message": "success", "data": "{\"items\":[{\"id\":1},{\"id\":2}]}" } ``` **解决:** 1. 选中整个 JSON → 格式化(先美化外层) 2. 选中 "data" 字段的值 → 解转义 JSON 3. 再次格式化内层 JSON ### 问题 3: 混合编码的 JSON **场景:** JSON 同时包含 URL 编码和转义 **输入:** ``` %7B%5C%22name%5C%22%3A%5C%22test%5C%22%7D ``` **解决:** 多次使用格式化功能,插件会自动处理多层编码 --- ## 🎯 使用技巧 ### 技巧 1: 使用智能提示 1. 选中 JSON 文本 2. 按 `Alt + Enter` (Windows/Linux) 或 `⌥ + ⏎` (Mac) 3. 选择建议的 JSON 操作 ### 技巧 2: 连续操作 对于复杂的混乱 JSON,可以连续使用: 1. 解转义 → 2. 格式化 → 3. 再次解转义(如果需要) ### 技巧 3: 使用工具窗口进行实验 在不确定结果时,先在工具窗口中尝试,避免直接修改编辑器中的代码。 --- ## 🛠️ 高级用例 ### 用例 1: 处理数据库导出的 JSON ```sql -- MySQL 导出的 JSON SELECT JSON_OBJECT('id', 1, 'name', 'Product', 'price', 99.99); ``` 结果可能是压缩的,使用格式化功能美化。 ### 用例 2: 处理 HTTP 请求日志 ``` POST /api/users HTTP/1.1 Content-Type: application/json {"username":"test","password":"******","profile":"{\"age\":25,\"city\":\"Beijing\"}"} ``` 选中 body 部分使用插件处理。 ### 用例 3: 处理配置文件 从环境变量或配置中心获取的压缩 JSON 配置: ```bash export CONFIG='{"db":{"host":"localhost","port":3306},"cache":{"enabled":true}}' ``` 复制配置值并格式化以便阅读。 --- ## 📋 支持的 JSON 变体 插件支持处理以下 JSON 变体: - ✅ 标准 JSON (RFC 8259) - ✅ 单引号 JSON - ✅ 带注释的 JSON (JSONC) - ✅ 带尾部逗号的 JSON - ✅ 转义的 JSON 字符串 - ✅ URL 编码的 JSON - ✅ Base64 编码的 JSON --- ## 🔧 开发 ### 技术栈 - Kotlin 2.1.0 - IntelliJ Platform SDK 2025.1 - Gson 2.10.1 - Gradle 8.x ### 项目结构 ``` src/main/kotlin/thoven/achievement/net/jsonutil/ ├── action/ # 编辑器操作 │ ├── FormatJsonAction.kt │ ├── CompactJsonAction.kt │ ├── UnescapeJsonAction.kt │ └── EscapeJsonAction.kt ├── intention/ # 智能提示 │ ├── FormatJsonIntention.kt │ └── UnescapeJsonIntention.kt ├── service/ # 核心服务 │ ├── JsonFormatter.kt │ └── JsonCleaner.kt ├── toolwindow/ # 工具窗口 │ ├── JsonToolWindowFactory.kt │ └── JsonToolWindowPanel.kt └── ui/ # UI 组件 └── JsonTreeViewer.kt ``` ### 构建和测试 ```bash # 编译 ./gradlew build # 运行插件(会启动一个带插件的 IDE 实例) ./gradlew runIde # 运行测试 ./gradlew test ``` --- ## 📝 更新日志 ### Version 1.0-SNAPSHOT #### 核心功能 - ✅ 基础 JSON 格式化和压缩 - ✅ JSON 清理和修复 - ✅ 转义/解转义支持 - ✅ URL 和 Base64 解码 - ✅ 树形可视化 - ✅ 编辑器右键菜单集成 - ✅ 工具窗口 - ✅ Intention Actions #### 新增功能 ⭐ - ✅ JSON 转 Java 实体类(自动生成 Getter/Setter) - ✅ JSON ⇌ YAML 格式互转 - ✅ JSON ⇌ Properties 格式互转 - ✅ JSONPath 查询功能(支持复杂表达式) - ✅ JWT 解码、生成和验证 - ✅ JSON ⇌ SQL INSERT 互转 - ✅ JSON 转 CREATE TABLE 语句 --- ## 🤝 贡献 欢迎提交 Issue 和 Pull Request! ## 📄 许可证 [] ## 👨‍💻 作者 **赵铁柱 (TieZhu Zhao)** - 📧 Email: d2782524001@gmail.com - 🐙 GitHub: [yexianglun-d](https://github.com/yexianglun-d) - 📦 Gitee: [BigDeng_Hh](https://gitee.com/BigDeng_Hh) ## 🙏 致谢 - IntelliJ Platform SDK - Gson Library - 所有贡献者 --- **快速开始:** 查看 [QUICK_START.md](QUICK_START.md) Happy JSON parsing! 🎉