SheepDev

数据格式与结构化数据

找出缺失字段和类型错误

使用工具

括号引号正确,数据仍可能不被接受。JSON 语法只检查可解析,不要求 count 必为数值或 name 必存在。Schema 在数据之外描述这些约定,这里用本地小例子、不发送 API 来验证。

SheepDev 仅支持部分 Schema 关键词,并非完整规范。本例使用当前实现的必填、单一类型、枚举与数值范围。它帮助定位不匹配,不替代完整业务契约验证。

先准备一组有效数据与 Schema

待验证 JSON
{"name":"Notebook","count":2,"status":"draft"}
Schema 输入
{
  "type": "object",
  "required": ["name", "count"],
  "properties": {
    "name": { "type": "string" },
    "count": { "type": "integer", "minimum": 0 },
    "status": { "enum": ["draft", "published"] }
  }
}

此组合通过:name、count 存在,前者字符串,后者非负整数,status 为允许值。先有通过基准,才能区分数据错误和 Schema 错误。之后固定 Schema,每次只改一项数据。

写进 properties 不代表必填

删除 count 的输入
{"name":"Notebook","status":"draft"}

count 在 required 中,缺失会失败;仅删 status 则通过。properties 描述字段存在时的条件,required 列必须存在的字段。已定义字段缺失却不报错时,检查这一区别。

必填不等于非空。此例 name 为空字符串仍通过,因为只要求字符串。拒绝空字符串需另加条件,不能把通过理解为业务名称有效。

2、"2" 与 null 是不同值

count 为字符串
{"name":"Notebook","count":"2","status":"draft"}

引号中的 2 是字符串,不满足 integer,验证不会因看似数值就转换。null 虽字段存在,也不是整数。应区分缺失、空字符串、null 与数值 0。

CSV 转换常出现此问题,看似 2 的单元格不一定变 JSON 整数。带前导零的 ID 可能必须保留字符串。不要只为通过 Schema 把所有数字样文本转数值,应确认字段含义。

类型正确,也可能不是允许值

负数与未知状态
{"name":"Notebook","count":-1,"status":"archived"}

-1 是整数但不满足 minimum:0,archived 不在 enum。类型本身不描述业务值域。改 count 为 0、status 为 draft 可解决两项。每次修复后再验,不假定一处修改会消掉所有错误。

把 archived 加入 enum 可能通过,但接收方未必会处理。应判断数据错误还是正式规范变化,不为消除报错而放宽契约。生成和消费方需使用对应版本。

此例没有禁止未知字段

加 extra 不被此 Schema 禁止,因为 properties 不是独占白名单。SheepDev 会拒绝 additionalProperties 等未支持关键词。需要完整契约时,应另用支持对应版本与关键词的验证器。

含 $schema、$ref、$dynamicRef 的 Schema 也会被拒绝,不外部获取。官方例子可能不能直接运行。删除未支持部分后通过,不等于验证原完整 Schema,应区分局部实验与完整检查。

记录通过原因和未检查条件

成功后记录检查了哪些必填、类型、枚举和范围。认证、ID 实际存在、库存和跨字段业务规则不在本例。Schema 通过不等于 API 必接受,只是发送前一环。

除正常例,还保留缺字段、数值字符串、null、负数和未知状态测试。同时验证该接受和该拒绝的输入,能发现 Schema 变更造成的意外放宽。依据错误路径判断改数据还是契约。

为什么通过 Schema 仍不能下单?

数量为大于等于一的整数、商品 ID 为字符串,仍可能停售或缺货。结构验证与业务数据校验是不同层。工具不查询数据库或服务,成功不证明 ID 存在或订单可完成,应明确通过的是哪层。

保留缺必填项、数字变字符串、枚举外值等反例。Schema 修改后以前失败的例子通过,应确认是有意放宽。只为消除错误去掉 required 可能只是减少检查,并未修好数据。还要确认关键字受此实现支持,未支持的条件不能算已验证。

参考资料

使用工具

指南 →