有界宽容原则
"有界宽容原则"是 JSONMap 和 ValUtil 的核心设计思想:在宽容与严格之间划定明确边界。
三大规则
1. 缺失容忍(Lenient on Missing)
路径不存在、值为 null 或空字符串时返回 null 或默认值,不抛异常:
JSONMap data = new JSONMap("{\"user\":{\"name\":\"张三\"}}");
data.getStr("user.age"); // → null(路径不存在)
data.getStr("user.age", "未知"); // → "未知"(使用默认值)
ValUtil.toInt(null); // → null
ValUtil.toInt("", 0); // → 0
2. 类型容忍(Lenient on Type)
类型不同但内容可以转换时,自动转换:
ValUtil.toInt("123"); // String → 123
ValUtil.toInt(123L); // Long → 123
ValUtil.toDouble("99.9"); // String → 99.9
ValUtil.toBoolean("true"); // String → true
ValUtil.toBoolean(1); // Integer → true
3. 内容不容忍(Strict on Content)
内容本身无法转换时,立即抛出异常(快速失败):
ValUtil.toInt("abc"); // → NumberFormatException
ValUtil.toInt("xyz"); // → NumberFormatException
ValUtil.toDouble("hello"); // → NumberFormatException
规则总结
| 情况 | 分类 | 行为 |
|---|---|---|
| 路径不存在 | 缺失容忍 | 返回 null 或默认值 |
| 值为 null / 空字符串 | 缺失容忍 | 返回 null 或默认值 |
| 类型不同但能转换 | 类型容忍 | 自动转换 |
| 内容无法转换 | 内容不容忍 | 抛出异常 |
设计理由
缺失容忍:API 数据可能缺少字段、前端可能不传某些参数,直接返回 null 减少样板代码。
类型容忍:前端传参类型不可控("123" 或 123),自动转换让代码更健壮。
内容不容忍:错误数据应尽早暴露。ValUtil.toInt("abc") 立即抛异常,避免错误数据传播到数据库或业务逻辑。