以下是 JSON数据类型与Java类型对照表 的详细说明,涵盖基础类型和常见复杂场景的映射关系:
一、基础类型映射
JSON 数据类型 | Java 类型 | 示例说明 |
---|---|---|
字符串 | String | "name":"John" → String name |
布尔值 | boolean /Boolean | "active":true → boolean active |
数值 | int /Integer | "age":25 → Integer age |
long /Long | "timestamp":1630454400000 → Long timestamp | |
double /Double | "price":19.99 → Double price | |
BigDecimal | "money":"123.456789" → BigDecimal money (推荐处理高精度数值) | |
null | 任意对象可为null | "address":null → Address address = null |
二、复合类型映射
JSON 结构 | Java 类型 | 注意事项 |
---|---|---|
对象(Object) | 自定义POJO类 | 需字段名称匹配{"name":"Lisa"} → User{String name} |
Map<String, Object> | 动态对象处理时使用JSON.parseObject(jsonStr, Map.class) | |
数组(Array) | List<T> /Set<T> | 需指定泛型类型[1,2,3] → List<Integer> |
T[] | 原生数组支持JSON.parseArray(jsonStr, Integer[].class) |
三、特殊类型处理
1. 日期时间
- JSON表示:字符串(需指定格式)
- Java映射:
// 方式1:注解指定格式 public class Order {@JSONField(format = "yyyy-MM-dd HH:mm:ss")private Date createTime; }// 方式2:全局配置 JSON.config().setDateFormat("yyyy-MM-dd");
2. 枚举类型
- JSON表示:字符串或ordinal数值
- Java映射:
public enum Status { OPEN, CLOSED }// JSON字符串"OPEN" → Status.OPEN // JSON数值0 → Status.OPEN
3. 泛型集合
- 类型擦除问题解决方案:
// 反序列化泛型集合 List<User> users = JSON.parseObject(jsonStr, new TypeReference<List<User>>() {});
四、类型转换规则
1. 自动类型转换
JSON 类型 → Java 类型 | 转换规则 |
---|---|
字符串 → 数值 | 尝试解析字符串内容("123" → Integer 123 ) |
数值 → 字符串 | 自动转为字符串表示(456 → "456" ) |
布尔 → 数值 | true →1, false →0 |
2. 强制转换限制
- 不兼容类型会抛出异常:
{"value": "abc"} → int value // 抛出JSONException
五、最佳实践
-
数值类型选择:
- 金额/高精度数值 → BigDecimal
- 时间戳 → Long
- ID类数据 → String(避免前端数值精度丢失)
-
防御性编程:
// 使用包装类代替基本类型 private Integer count; // 允许null值
-
日期统一格式:
- 建议使用 ISO-8601 格式:
"2023-08-20T14:30:00Z"
- 建议使用 ISO-8601 格式:
六、常见问题排查
1. 类型不匹配错误
// 错误示例:JSON数值超出int范围
// JSON: {"id": 3147483647}
public class Entity {private int id; // 超出int最大值会导致数据错误
}
解决方案:改用Long
类型
2. 泛型反序列化失败
// 错误写法:直接使用List.class
List<User> users = JSON.parseObject(jsonStr, List.class); // 得到List<JSONObject>!
正确写法:使用TypeReference
掌握这些映射关系,可以有效避免90%的JSON解析类型错误!建议结合fastjson2的注解系统进行更精细的类型控制。