如何确保NJsonSchema仅包含必填字段?

时间:2016-04-19 23:16:28

标签: c# njsonschema

我使用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:

        {
          "$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,但它始终包含在架构中,生成的架构还包括两个架构路径,当它只应包含一个时,似乎解析器不会展平属性。 / p>

更新

这解决了正在创建多个架构路径的问题

new JsonSchemaGeneratorSettings
{
    FlattenInheritanceHierarchy = true
}

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

2 个答案:

答案 0 :(得分:3)

我是图书馆NJsonSchema的作者。

忽略属性

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

  

时会忽略属性      
      
  1. 该属性标有JsonIgnoreAttribute属性
  2.   
  3. 该类具有DataContractAttribute属性,且该属性没有DataMemberAttribute且没有JsonPropertyAttribute
  4.   

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

展平继承层次结构

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

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

答案 1 :(得分:1)

由于NJsonSchema依赖于Newtonsoft.Json,您是否尝试过使用Newtonsoft.Json文档?

Conditional Property Serialization

  

要有条件地序列化属性,请添加返回的方法   boolean与属性同名,然后为方法添加前缀   使用ShouldSerialize命名。该方法的结果确定是否   该属性是序列化的。如果方法返回true则为   属性将被序列化,如果它返回false然后属性   将被跳过。