如何向现有JSON Schema新增字段并在流水线动态生成C#类
解决方案
合并JSON Schema的实现方式
无需手动拷贝字段合并,可通过JSON Schema原生的allOf关键字实现多Schema拼接,适配你要新增字段的需求:
- 基础Schema(
base.schema.json,修正原示例required字段笔误,原必填字段应为productName)
{ "type": "object", "required": [ "productName" ], "additionalProperties": false, "properties": { "productName": { "enum": [ "product1", "product2", "product3" ] }, "price": { "type": "integer" } } }
- 扩展字段Schema(
extension.schema.json,存放新增的productQuantity字段定义)
{ "type": "object", "required": [ "productQuantity" ], "properties": { "productQuantity": { "type": "integer", "minimum": 1 } } }
- 合并后的总Schema(
merged.schema.json)
{ "$schema": "http://json-schema.org/draft-07/schema#", "allOf": [ { "$ref": "base.schema.json" }, { "$ref": "extension.schema.json" } ], "unevaluatedProperties": false }
注意:使用allOf拼接多Schema时,需用unevaluatedProperties替代additionalProperties限制额外字段,后者无法识别allOf引入的属性
跨Schema引用规则
无需重复定义公共字段/结构,JSON Schema支持通过$ref关键字引用任意Schema的指定片段:
- 公共定义Schema(
common.schema.json)示例
{ "$defs": { "priceType": { "type": "integer", "minimum": 0, "maximum": 99999 } } }
- 引用方式:在需要复用该结构的位置直接填写对应路径即可
"price": { "$ref": "common.schema.json#/$defs/priceType" }
GitHub Pipeline生成C#类的操作步骤
选择NJsonSchema作为代码生成工具,原生支持$ref和allOf语法,无需提前手动合并Schema:
- 本地/CI环境提前安装dotnet工具:
dotnet tool install --global NJsonSchema.CodeGeneration.CSharp.Tool - 在Pipeline构建流程中添加生成命令,直接读取总Schema生成C#类:
njsonschema generate-csharp /input:merged.schema.json /output:YourProject/Models/Product.cs /namespace:YourProject.Models - 后续正常构建项目即可,生成的C#类会自动包含所有继承/引用的字段。
内容的提问来源于stack exchange,提问作者briswill
相关产品推荐
相关产品推荐

