当前位置: 首页 > 知识库问答 >
问题:

json.net.schema:如何生成一个只需要[Required]属性的模式?

郎鸿朗
2023-03-14

我正在编写一个工具来处理Resume.Json文件(项目),并正在创建一个Json模式来验证用户输入。我试图用json.net.schema实现自动化,但是输出总是要求所有属性,不管这些属性是[required]还是[JsonRequired]属性。

var generator = new JSchemaGenerator
{
    ContractResolver = new CamelCasePropertyNamesContractResolver(),
    SchemaIdGenerationHandling = SchemaIdGenerationHandling.TypeName
};

var schema = generator.Generate(typeof(Resume));
var sb = new StringBuilder();
schema.WriteTo(new JsonTextWriter(
    new IndentedTextWriter(
        new StringWriter(sb),
        "  ")
    )
{
    Formatting = Formatting.Indented,
    IndentChar = ' ', Indentation = 2,
    QuoteName = true
}, new JSchemaWriterSettings
{
    Version = SchemaVersion.Draft7
});

File.WriteAllText("E:\\resume.schema", sb.ToString());
public class Resume
{
    [Required]
    public Basics Basics { get; set; }
    public Work[] Work { get; set; }
    public Volunteer[] Volunteer { get; set; }
    public Education[] Education { get; set; }
    public Award[] Awards { get; set; }
    public Publication[] Publications { get; set; }
    public Skill[] Skills { get; set; }
    public Language[] Languages { get; set; }
    public Interest[] Interests { get; set; }
    public Reference[] References { get; set; }
}

public class Award
{
    [Required]
    public string Title { get; set; }
    public string Date { get; set; }
    public string Awarder { get; set; }
    public string Summary { get; set; }
}

public class Basics
{
    [Required]
    public string Name { get; set; }
    public string Label { get; set; }
    public Uri Picture { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string Website { get; set; }
    public string Summary { get; set; }
    public Location Location { get; set; }
    public Profile[] Profiles { get; set; }
}

public class Education
{
    [Required]
    public string Institution { get; set; }
    public string Area { get; set; }
    public string StudyType { get; set; }
    public string StartDate { get; set; }
    public string EndDate { get; set; }
    public string Gpa { get; set; }
    public string[] Courses { get; set; }
}

public class Interest
{
    [Required]
    public string Name { get; set; }
    public string[] Keywords { get; set; }
}

public class Language
{
    [Required]
    public string language { get; set; }
    [Required]
    public string Fluency { get; set; }
}

public class Location
{
    public string Address { get; set; }
    [Required]
    public string PostalCode { get; set; }
    [Required]
    public string City { get; set; }
    [Required]
    public string CountryCode { get; set; }
    public string Region { get; set; }
}

public class Profile
{
    [Required]
    public string Network { get; set; }
    [Required]
    public string Username { get; set; }
    [Required]
    public string Url { get; set; }
}

public class Publication
{
    [Required]
    public string Name { get; set; }
    public string Publisher { get; set; }
    public string ReleaseDate { get; set; }
    public string Website { get; set; }
    public string Summary { get; set; }
}

public class Reference
{
    [Required]
    public string Name { get; set; }
    public string reference { get; set; }
}

public class Skill
{
    [Required]
    public string Name { get; set; }
    [Required]
    public string Level { get; set; }
    public string[] Keywords { get; set; }
}

public class Volunteer
{
    [Required]
    public string Organization { get; set; }
    [Required]
    public string Position { get; set; }
    public string Website { get; set; }
    public string StartDate { get; set; }
    public string EndDate { get; set; }
    public string Summary { get; set; }
    public string[] Highlights { get; set; }
}

public class Work
{
    [Required]
    public string Company { get; set; }
    [Required]
    public string Position { get; set; }
    public string Website { get; set; }
    [Required]
    public string StartDate { get; set; }
    public string EndDate { get; set; }
    public string Summary { get; set; }
    public string[] Highlights { get; set; }
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "Resume",
  "definitions": {
    "Award": {
      "$id": "Award",
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "title": {
          "type": "string"
        },
        "date": {
          "type": [
            "string",
            "null"
          ]
        },
        "awarder": {
          "type": [
            "string",
            "null"
          ]
        },
        "summary": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "title",
        "date",
        "awarder",
        "summary"
      ]
    },
    "Basics": {
      "$id": "Basics",
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "label": {
          "type": [
            "string",
            "null"
          ]
        },
        "picture": {
          "type": [
            "string",
            "null"
          ],
          "format": "uri"
        },
        "email": {
          "type": [
            "string",
            "null"
          ]
        },
        "phone": {
          "type": [
            "string",
            "null"
          ]
        },
        "website": {
          "type": [
            "string",
            "null"
          ]
        },
        "summary": {
          "type": [
            "string",
            "null"
          ]
        },
        "location": {
          "$id": "Location",
          "type": [
            "object",
            "null"
          ],
          "properties": {
            "address": {
              "type": [
                "string",
                "null"
              ]
            },
            "postalCode": {
              "type": "string"
            },
            "city": {
              "type": "string"
            },
            "countryCode": {
              "type": "string"
            },
            "region": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          "required": [
            "address",
            "postalCode",
            "city",
            "countryCode",
            "region"
          ]
        },
        "profiles": {
          "$id": "Profile[]",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$id": "Profile",
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "network": {
                "type": "string"
              },
              "username": {
                "type": "string"
              },
              "url": {
                "type": "string"
              }
            },
            "required": [
              "network",
              "username",
              "url"
            ]
          }
        }
      },
      "required": [
        "name",
        "label",
        "picture",
        "email",
        "phone",
        "website",
        "summary",
        "location",
        "profiles"
      ]
    },
    "Education": {
      "$id": "Education",
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "institution": {
          "type": "string"
        },
        "area": {
          "type": [
            "string",
            "null"
          ]
        },
        "studyType": {
          "type": [
            "string",
            "null"
          ]
        },
        "startDate": {
          "type": [
            "string",
            "null"
          ]
        },
        "endDate": {
          "type": [
            "string",
            "null"
          ]
        },
        "gpa": {
          "type": [
            "string",
            "null"
          ]
        },
        "courses": {
          "$id": "String[]",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "required": [
        "institution",
        "area",
        "studyType",
        "startDate",
        "endDate",
        "gpa",
        "courses"
      ]
    },
    "Interest": {
      "$id": "Interest",
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "keywords": {
          "$id": "String[]",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "required": [
        "name",
        "keywords"
      ]
    },
    "Language": {
      "$id": "Language",
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "language": {
          "type": "string"
        },
        "fluency": {
          "type": "string"
        }
      },
      "required": [
        "language",
        "fluency"
      ]
    },
    "Location": {
      "$ref": "Location"
    },
    "Profile": {
      "$ref": "Profile"
    },
    "Publication": {
      "$id": "Publication",
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "publisher": {
          "type": [
            "string",
            "null"
          ]
        },
        "releaseDate": {
          "type": [
            "string",
            "null"
          ]
        },
        "website": {
          "type": [
            "string",
            "null"
          ]
        },
        "summary": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "name",
        "publisher",
        "releaseDate",
        "website",
        "summary"
      ]
    },
    "Reference": {
      "$id": "Reference",
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "reference": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "name",
        "reference"
      ]
    },
    "Skill": {
      "$id": "Skill",
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "level": {
          "type": "string"
        },
        "keywords": {
          "$id": "String[]",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "required": [
        "name",
        "level",
        "keywords"
      ]
    },
    "Volunteer": {
      "$id": "Volunteer",
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "organization": {
          "type": "string"
        },
        "position": {
          "type": "string"
        },
        "website": {
          "type": [
            "string",
            "null"
          ]
        },
        "startDate": {
          "type": [
            "string",
            "null"
          ]
        },
        "endDate": {
          "type": [
            "string",
            "null"
          ]
        },
        "summary": {
          "type": [
            "string",
            "null"
          ]
        },
        "highlights": {
          "$id": "String[]",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "required": [
        "organization",
        "position",
        "website",
        "startDate",
        "endDate",
        "summary",
        "highlights"
      ]
    },
    "Work": {
      "$id": "Work",
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "company": {
          "type": "string"
        },
        "position": {
          "type": "string"
        },
        "website": {
          "type": [
            "string",
            "null"
          ]
        },
        "startDate": {
          "type": "string"
        },
        "endDate": {
          "type": [
            "string",
            "null"
          ]
        },
        "summary": {
          "type": [
            "string",
            "null"
          ]
        },
        "highlights": {
          "$id": "String[]",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "required": [
        "company",
        "position",
        "website",
        "startDate",
        "endDate",
        "summary",
        "highlights"
      ]
    }
  },
  "type": "object",
  "properties": {
    "basics": {
      "$ref": "Basics"
    },
    "work": {
      "$id": "Work[]",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "Work"
      }
    },
    "volunteer": {
      "$id": "Volunteer[]",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "Volunteer"
      }
    },
    "education": {
      "$id": "Education[]",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "Education"
      }
    },
    "awards": {
      "$id": "Award[]",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "Award"
      }
    },
    "publications": {
      "$id": "Publication[]",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "Publication"
      }
    },
    "skills": {
      "$id": "Skill[]",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "Skill"
      }
    },
    "languages": {
      "$id": "Language[]",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "Language"
      }
    },
    "interests": {
      "$id": "Interest[]",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "Interest"
      }
    },
    "references": {
      "$id": "Reference[]",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "Reference"
      }
    }
  },
  "required": [
    "basics",
    "work",
    "volunteer",
    "education",
    "awards",
    "publications",
    "skills",
    "languages",
    "interests",
    "references"
  ]
}

如何让架构生成器遵守必需的属性?

共有1个答案

洪光霁
2023-03-14

JSchemaGenerator有一个属性DefaultreQuered:

获取或设置架构的默认必需状态。

出于某种原因,该属性的默认值为required.allownull,如源代码所示:

public JSchemaGenerator()
{
    _schemaReferenceHandling = SchemaReferenceHandling.Objects;
    _defaultRequired = Required.AllowNull;
}
var generator = new JSchemaGenerator
{
    ContractResolver = new CamelCasePropertyNamesContractResolver(),
    SchemaIdGenerationHandling = SchemaIdGenerationHandling.TypeName,
    DefaultRequired = Required.Default,
};

defaultrequered的默认值没有文档化,但可能应该有文档化。您可能会对Newtonsoft提出一个问题,要求对文档进行澄清。

在这里演示小提琴。

 类似资料:
  • 我想知道我是否可以定义一个JSON模式(草案4),它至少需要对象的许多属性中的一个。我已经知道、和之一,但就是不知道如何以我想要的方式使用它们。 下面是一些JSON示例来说明:

  • 我有这个猫鼬帖子模式。 在验证中,类型为,

  • 我们的结构如下所示: 这几乎等同于说 只是这将允许传入一个空对象,而初始类型需要传入一个属性 如何创建像 这样的泛型,但它的行为类似于上面的结构?

  • 我想申请以下权限:。根据这个答案,我是这样申请权限的: 问题是我的应用程序只请求存储权限没有别的。 和是未请求或授予的权限。我如何按顺序询问所有权限? 以下是未授予和权限的证明:

  • 以下是我的示例:Java: 我将名称设为必填字段。在请求中如何将其设为必填字段。我应该从请求中发送名称值。 但是当我输入这个时: 它应该返回错误响应。 请帮帮我。

  • 假设: 只有一个特定的线程设置了某个引用字段(不是长或双精度,所以写入它是原子的) 有任意数量的线程可能会读取同一个字段 稍微陈旧的读取是可以接受的(最多几秒钟) 在这种情况下,您需要挥发性或原子参考或类似的东西吗? 该条指出: 如果您严格遵守单一写入器原则,则不需要内存障碍。 这似乎表明,在我描述的情况下,你真的不需要做任何特殊的事情。 我做了一个测试,结果很奇怪: 有时运行this会输出“线程