如何确保NJsonSchema只包括必需的字段

本文关键字:包括必 字段 NJsonSchema 何确保 确保 | 更新日期: 2024-10-18 17:44:12

我使用NJsonSchema v2.6为以下类生成JSON模式:

[DataContract(Name = "Message", Namespace = "")]
public class AMessageModel
{
    [DataMember]
    internal Guid MessageId { get; set; }
    internal DateTime MessageDate { get; set; }
}
[DataContract(Name = "Message", Namespace = "")]
public class AddUserMessage : AMessageModel
{
    [DataMember]
    public string AccountName { get; set; }
    [DataMember]
    public string FistName { get; set; }
    [Range(2, 5)]
    [DataMember]
    public string LastName { get; set; }
    [DataMember]
    public string Email { get; set; }
    [DataMember]
    public string Password { get; set; }
}

生成的JSON模式:

        {
          "$schema": "http://json-schema.org/draft-04/schema#",
          "type": "object",
          "typeName": "AddFitnessHubAccountMessage",
          "additionalProperties": false,
          "properties": {
            "AccountName": {
              "type": [
                "null",
                "string"
              ]
            },
            "FistName": {
              "type": [
                "null",
                "string"
              ]
            },
            "LastName": {
              "type": [
                "null",
                "string"
              ]
            },
            "Email": {
              "type": [
                "null",
                "string"
              ]
            },
            "Password": {
              "type": [
                "null",
                "string"
              ]
            }
          },
          "allOf": [
            {
              "type": "object",
              "typeName": "AMessageModel",
              "additionalProperties": false,
              "properties": {
                "MessageId": {
                  "type": "string",
                  "format": "guid"
                },
                "MessageDate": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            }
          ]
        }

即使MessageDate属性没有被标记为DataMember,它总是包含在架构中,而且生成的架构包括两个架构路径,而它应该只包括一个,但解析器似乎没有平坦化属性。

更新

这修复了创建的多个模式路径的问题

new JsonSchemaGeneratorSettings
{
    FlattenInheritanceHierarchy = true
}

GitHub问题:https://github.com/NJsonSchema/NJsonSchema/issues/53

如何确保NJsonSchema只包括必需的字段

我是NJsonSchema库的作者。

忽略的属性

库中有一个错误,现在(v2.7+)属性忽略的工作原理如下:

  1. 该属性标记为JsonIgnoreAttribute属性
  2. 类具有DataContractAttribute属性,而属性没有DataMemberAttributeJsonPropertyAttribute

https://github.com/NJsonSchema/NJsonSchema/wiki/JsonSchemaGenerator

扁平化继承层次结构

正如您已经发现的,您可以通过FlattenInheritanceHierarchy设置来展平继承层次结构。。。

该库主要用于代码生成,因此通常需要继承。

由于NJsonSchema依赖于Newtonsoft.Json,您在Newtonsoft.Json文档中尝试过吗?

条件属性序列化

若要有条件地序列化属性,请添加一个返回与属性名称相同的布尔值,然后在方法前面加前缀带有ShouldSerialize的名称。该方法的结果决定属性被序列化。如果该方法返回true,则属性将被序列化,如果返回false,则该属性将被跳过。