# JsonParser **Repository Path**: QQXQQ/JsonParser ## Basic Information - **Project Name**: JsonParser - **Description**: 解析JSON - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-12-24 - **Last Updated**: 2026-02-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JsonParser 学习实现简单的 Java JSON 解析库,支持 JSON 解析、类型转换、自定义字段映射和对象序列化。 ## 📋 目录 - [功能特性](#功能特性) - [安装配置](#安装配置) - [快速开始](#快速开始) - [API 参考](#api-参考) - [注解使用](#注解使用) - [高级用法](#高级用法) - [项目结构](#项目结构) - [许可证](#许可证) ## ✨ 功能特性 | 功能 | 描述 | |------|------| | **JSON 解析** | 将 JSON 字符串解析为抽象语法树 (AST) | | **类型转换** | 支持将 JSON 转换为任意 Java 对象 | | **对象序列化** | 支持将 Java 对象转换为 JSON 字符串 | | **注解支持** | `@JsonField` 自定义字段名,`@IgnoreField` 忽略字段 | | **泛型支持** | 使用 `TypeRef` 支持复杂泛型类型的解析 | | **注释处理** | 支持解析 JSON 中的注释内容 | | **多类型支持** | 支持基本类型、列表、Map 和自定义对象 | ## 📦 安装配置 ### Maven 依赖 ```xml com.aix JsonParser 1.0.0 ``` ### Gradle 依赖 ```gradle implementation 'com.aix:JsonParser:1.0.0' ``` ## 🚀 快速开始 ### 1. 解析 JSON 为 Expression (AST) ```java import com.aix.JsonPlus; import com.aix.parser.ast.Expression; import com.aix.parser.ast.ObjectExpression; // 将 JSON 字符串解析为 Expression 对象 Expression expression = JsonPlus.parseToExpression("{\"name\":\"test\",\"value\":123}"); // 可以进一步获取成员值 if (expression instanceof ObjectExpression) { ObjectExpression objectExpr = (ObjectExpression) expression; Expression nameExpr = objectExpr.getMember("name"); System.out.println("Parsed: " + expression.toJson()); } ``` ### 2. 解析 JSON 为 Java 对象 ```java import com.aix.JsonPlus; import com.aix.parser.TypeRef; // 解析为简单对象 User user = JsonPlus.parse(jsonString, new TypeRef(){}); // 解析为列表 List users = JsonPlus.parse(jsonString, new TypeRef>(){}); // 解析为 Map Map userMap = JsonPlus.parse(jsonString, new TypeRef>(){}); // 解析嵌套泛型 List>> complexData = JsonPlus.parse( jsonString, new TypeRef>>>(){} ); ``` ### 3. 对象序列化为 JSON ```java User user = new User(); user.setId(1); user.setName("张三"); user.setAge(25); // 将 Java 对象转换为 JSON 字符串 String json = JsonPlus.toJson(user); // 输出: {"id":1,"name":"张三","age":25} ``` ## 📖 API 参考 ### JsonPlus 类 - 主入口 | 方法签名 | 说明 | |----------|------| | `static Expression parseToExpression(String json)` | 将 JSON 字符串解析为 Expression AST | | `static T parse(String json, TypeRef typeRef)` | 将 JSON 解析为指定类型的对象 | | `static String toJson(Object obj)` | 将 Java 对象序列化为 JSON 字符串 | | `static T convertToType(Expression expression, Type type)` | 将 Expression 转换为指定 Java 类型 | | `static Expression toExpression(Object obj)` | 将 Java 对象转换为 Expression | ### Parser 相关类 | 类名 | 说明 | |------|------| | `DefaultParser` | JSON 解析器默认实现,负责词法分析和语法解析 | | `Parser` | 解析器接口 | | `Token` | Token 枚举,定义所有 JSON 语法 token | | `TokenObject` | Token 对象,包含 token 类型和值 | | `TypeRef` | 类型引用,用于支持泛型类型解析 | ### Expression AST 类 | 类名 | 说明 | |------|------| | `Expression` | 表达式接口,所有表达式类型的父接口 | | `ObjectExpression` | 对象表达式,表示 JSON 对象 `{...}` | | `ArrayExpression` | 数组表达式,表示 JSON 数组 `[...]` | | `StringExpression` | 字符串表达式,表示 JSON 字符串 | | `NumberExpression` | 数字表达式,表示 JSON 数字 | | `BoolExpression` | 布尔表达式,表示 `true`/`false` | | `NullExpression` | 空值表达式,表示 `null` | | `CommentExpression` | 注释表达式,表示 JSON 注释 | ## 🏷️ 注解使用 ### @JsonField - 自定义字段名 用于指定字段在 JSON 中的名称,支持重命名和映射。 ```java import com.aix.annotation.JsonField; public class User { private int id; @JsonField(name = "user_name") private String name; @JsonField(name = "user_age") private int age; // 省略 getter/setter } ``` **使用示例:** ```java String json = "{\"id\":1,\"user_name\":\"张三\",\"user_age\":25}"; User user = JsonPlus.parse(json, new TypeRef(){}); // user.getName() 返回 "张三" ``` ### @IgnoreField - 忽略字段 用于标记在序列化和反序列化时需要忽略的字段。 ```java import com.aix.annotation.IgnoreField; public class User { private String username; @IgnoreField private String password; // 不会被序列化/反序列化 private String email; // 省略 getter/setter } ``` **使用示例:** ```java User user = new User(); user.setUsername("zhangsan"); user.setPassword("secret123"); user.setEmail("zhangsan@example.com"); String json = JsonPlus.toJson(user); // 输出: {"username":"zhangsan","email":"zhangsan@example.com"} // password 字段被忽略 ``` ## 🔧 高级用法 ### 自定义类型转换 通过实现 `ValueConvertHandler` 接口进行自定义值转换: ```java import com.aix.handler.ValueConvertHandler; public class DateConverter implements ValueConvertHandler { private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd"); @Override public Object convert(Object value) { if (value instanceof String) { try { return SDF.parse((String) value); } catch (ParseException e) { return null; } } return value; } } ``` ### 处理复杂嵌套对象 ```java // 定义实体类 public class Entity { private int id; private String key; private String value; @JsonField(name = "children") private List children; // 省略 getter/setter } // 解析嵌套 JSON String json = "{\"id\":1,\"key\":\"root\",\"children\":[{\"id\":2,\"key\":\"child1\"}]}"; Entity root = JsonPlus.parse(json, new TypeRef(){}); ``` ### 直接操作 AST ```java String json = "{\"items\":[1,2,3],\"enabled\":true}"; Expression expr = JsonPlus.parseToExpression(json); if (expr instanceof ObjectExpression) { ObjectExpression obj = (ObjectExpression) expr; // 获取数组成员 Expression itemsExpr = obj.getMember("items"); if (itemsExpr instanceof ArrayExpression) { ArrayExpression arr = (ArrayExpression) itemsExpr; for (int i = 0; i < arr.getMembers().size(); i++) { Expression item = arr.getMember(i); System.out.println("Item " + i + ": " + item.toJson()); } } // 获取布尔值 Expression enabledExpr = obj.getMember("enabled"); if (enabledExpr instanceof BoolExpression) { boolean enabled = ((BoolExpression) enabledExpr).isValue(); System.out.println("Enabled: " + enabled); } } ``` ## 📁 项目结构 ``` JsonParser/ ├── src/main/java/com/aix/ │ ├── JsonPlus.java # 主入口类,提供核心 API │ ├── annotation/ │ │ ├── IgnoreField.java # 忽略字段注解 │ │ └── JsonField.java # 自定义字段名注解 │ ├── handler/ │ │ └── ValueConvertHandler.java # 值转换处理器接口 │ ├── parser/ │ │ ├── DefaultParser.java # JSON 解析器实现 │ │ ├── Parser.java # 解析器接口 │ │ ├── Token.java # Token 枚举类 │ │ ├── TokenObject.java # Token 包装对象 │ │ ├── TypeRef.java # 类型引用(支持泛型) │ │ └── ast/ # 抽象语法树表达式 │ │ ├── AbstractExpression.java # 表达式抽象基类 │ │ ├── ArrayExpression.java # 数组表达式 │ │ ├── BoolExpression.java # 布尔表达式 │ │ ├── CommentExpression.java # 注释表达式 │ │ ├── Expression.java # 表达式接口 │ │ ├── NullExpression.java # 空值表达式 │ │ ├── NumberExpression.java # 数字表达式 │ │ ├── ObjectExpression.java # 对象表达式 │ │ └── StringExpression.java # 字符串表达式 ├── src/test/java/com/aix/ │ ├── Entity.java # 测试实体类 │ └── Test.java # 测试类 ├── pom.xml # Maven 配置文件 └── LICENSE # MIT 许可证 ``` ## 📊 支持的数据类型 ### 基本类型 | Java 类型 | JSON 类型 | |-----------|-----------| | `int` / `Integer` | 数字 | | `long` / `Long` | 数字 | | `double` / `Double` | 数字 | | `float` / `Float` | 数字 | | `boolean` / `Boolean` | 布尔值 | | `String` | 字符串 | ### 集合类型 | Java 类型 | JSON 类型 | |-----------|-----------| | `List` | 数组 | | `Set` | 数组 | | `Map` | 对象 | ### 自定义对象 支持任意 POJO 对象的序列化和反序列化,通过反射实现字段映射。 ## 📄 许可证 本项目采用 **MIT 许可证**。 ``` MIT License Copyright (c) 2024 JsonParser Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` ## 🤝 贡献 欢迎提交 Issue 和 Pull Request!