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

问题描述 投票:0回答:3

我正在使用 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

c# njsonschema
3个回答
5
投票

我是库 NJsonSchema 的作者。

忽略的属性

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

当满足以下任一条件时,属性将被忽略

  1. 该属性标有
    JsonIgnoreAttribute
    属性
  2. 该类有一个
    DataContractAttribute
    属性,而该属性没有
    DataMemberAttribute
    并且没有
    JsonPropertyAttribute

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

扁平化继承层次结构

正如您已经发现的,您可以通过

FlattenInheritanceHierarchy
设置来展平继承层次结构...

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


1
投票

由于 NJsonSchema 依赖于 Newtonsoft.Json,您是否从 Newtonsoft.Json 文档中尝试过此操作?

条件属性序列化

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


0
投票

对我来说,因为我有一个库组件,我的类派生自该组件。解决方案是在两者之间添加一个包装器并注释该包装器类。

[NJsonSchema.Annotations.JsonSchemaIgnore]
public class NonSchemaComponentWrapper : Component
{

}

原班:

[Serializable]
public class Unit : NonSchemaComponentWrapper, IUpdatable, IPathProvider, IInteractive, IAttack
{
© www.soinside.com 2019 - 2024. All rights reserved.