03 January 2016

JSON 的空值、字段名和日期格式会成为接口协议的一部分。Nutz 将这些策略放在注解和 JsonFormat 中,阅读它们时,需要继续跟到渲染器实际使用配置的位置。本文基于 1.b.53。

注解描述对象怎样输出

JsonField 可以指定字段名称、是否忽略、字符串化和日期格式等策略,JsonIgnore 表达忽略,ToJson 提供自定义输出入口。自定义输出会影响对象对外的表示,因此要同时检查方法签名、返回形式与失败处理。

注解不是格式转换的全部实现:它先进入字段或实体描述,再由转换与渲染流程解释。阅读时以一条带注解的字段为样例,比较 Java 属性名与实际 JSON 键,而不是只查看注解定义。

预设格式也会改变字段集合

在该版本中,compact 是紧凑并忽略 null,tidy 是紧凑但保留 null;nice 与 full 则提供不同的易读输出组合。forLook 还会关闭字段名引号,更适合观察,不应默认当作严格 JSON 接口输出。

Map<String, Object> data = new LinkedHashMap<>();
data.put("name", "Alice");
data.put("remark", null);
System.out.println(Json.toJson(data, JsonFormat.compact()));
System.out.println(Json.toJson(data, JsonFormat.tidy()));

片段需要 JDK 的 Map、LinkedHashMap 和 Nutz Json、JsonFormat。观察的不只是空格差异,还包括 remark 是否存在。客户端可能区分缺失字段与显式 null,不能为了日志更短就随意改变接口格式。

异常提供定位,不代替输入约束

JsonException 的位置信息可以帮助定位解析失败,但日志里不应无界输出整个请求。日期、枚举和数值的业务合法性仍要在解析后检查;能构造一个对象,不代表它已经满足业务规则。

参考:Nutz 1.b.53 源码。





blog comments powered by Disqus
Fork me on GitHub