首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NjsonSchema验证如果Property1等于某物,则需要Property2

NjsonSchema验证如果Property1等于某物,则需要Property2
EN

Stack Overflow用户
提问于 2022-02-12 12:14:27
回答 2查看 520关注 0票数 0

我似乎无法让const或enum作为if-然后-否则JSON模式验证的一部分工作。

当涉及到一个验证值时,它们似乎是可互换的。(参考文献)

这是我的JSON模式

代码语言:javascript
复制
    {
      "$schema": "http://json-schema.org/draft-07/schema#",
      "title": "Test_Schema",
      "description": "A schema for validating a test object",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "GeneralData": {
          "type": "object",
          "description": "Advsor and admin customer information",
          "properties": {
            "Name": {
              "type": [ "string", "null" ],
              "description": "Customer's advisor name"
            },
            "Age": {
              "type": [ "string", "null" ],
              "description": "Customer's advisor email"
            },
            "Location": {
              "type": [ "string", "null" ],
              "description": "The advisor's manager email'"
            }
          },
          "required": [ "Name", "Location", "Age" ]
        },
        "ClientData": {
          "type": "object",
          "description": "Customer's information",
          "additionalProperties": false,
          "properties": {
            "Title": {
              "type": [ "string", "null" ]
            },
            "Forename": {
              "type": [ "string", "null" ]
            },
            "Surname": {
              "type": [ "string" ]
            }
          },
          "required": [ "Title" ],
          "if": {
            "properties": {
              "Forename": { "enum": [ "Soameonea" ] }
            },
            "required": [ "Forename" ]
          },
          "then": { "required": [ "Surname" ] },
          "else": false 
        }
      }
    }

如果名字=“某人”,我想要姓。

以下是序列化后的jsonObject:

代码语言:javascript
复制
     {
        "GeneralData": {
            "Name": "Not Relevant",
            "Age": "Not Relevant",
            "Location": "Not Relevant"
        },
        "ClientData": {
            "Title": "SomeTitle",
            "Forename": "Someone",
            "Surname": null
        }
    }

验证代码:

代码语言:javascript
复制
     internal void ValidateDataObjectOnSchema()
            {
                var dataObject = PopulateDataObject();
                var json = JsonConvert.SerializeObject(dataObject);
                var result = GetSchema().Validate(json);
                var errors = result.Select(x =>
                {
                    return new Errors() { Title = x.Property, Description = x.Schema.Description };
                });
                var i = errors;
    
            }

      internal JsonSchema GetSchema()
            {
                return JsonSchema.FromFileAsync("Test/testSchema.json").Result;
            }

现在,它仍然需要姓,尽管枚举Soameonea !=某人和我只需要头衔。<== Issue1

在JSON模式中,如果我设置了“姓氏”:{“type”:“string”,"null},那么错误就消失了,如果我随后将Forename枚举的if条件更改为“某人”,则仍然不会得到错误。<==问题2。

如果我将Enum替换为Const,则无法获得不同的验证输出,因此,如果我能够让其中一个工作,我确信另一个也会遵循。

我已经找到了这个问题(答案1)的几个答案,我试图实现相同的东西,但由于某种原因,它在我的例子中失败了。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-12 14:17:07

更新:正如其中一条注释中所提到的,NJson模式似乎只支持草案04,这就是为什么如果-如果-如果下面是我使用替代包的解决方案。

相同的代码和json用于包Newtonsoft.Json.Schema (参考文献)。

代码:

代码语言:javascript
复制
  internal void ValidateDataObjectOnSchemaWithNewtonSoftJson()
        {
            var dataObject = PopulateDataObject();
            var settings = new JsonSerializerSettings()
            {
                NullValueHandling = NullValueHandling.Ignore

            };
            var jsonDataObjectString = JsonConvert.SerializeObject(dataObject, settings);
            JObject jsonDataObject = JObject.Parse(jsonDataObjectString);
            var jsonSchemaFile = File.ReadAllText("Test/testSchema.json");
            var schema = JSchema.Parse(jsonSchemaFile);
            ;
            IList<ValidationError> messages;
            var result = jsonDataObject.IsValid(schema, out messages);
            var errors = GetReadableResult(result, messages);

        }

        private List<Errors> GetReadableResult(bool result, IList<ValidationError> messages)
        {
            var errors = new List<Errors>();

            if (!result)
            {
                foreach (var error in messages)
                {
                    if (error.ChildErrors.Count > 0)
                    {
                        errors.Add(
                            new Errors()
                            {
                                Path = error.ChildErrors.FirstOrDefault()?.Path,
                                Kind = error.ChildErrors.FirstOrDefault()?.Message
                            });
                    }
                    else
                    {
                        errors.Add(new Errors()
                        {
                            Path = error.Path,
                            Kind = error.Message
                        });
                    }
                }
            }

            return errors;
        }

JsonSchema:

代码语言:javascript
复制
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Test_Schema",
  "description": "A schema for validating a test object",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "GeneralData": {
      "type": "object",
      "description": "Advsor and admin customer information",
      "properties": {
        "Name": {
          "type": [ "string", "null" ],
          "description": "Customer's advisor name"
        },
        "Age": {
          "type": [ "string", "null" ],
          "description": "Customer's advisor email"
        },
        "Location": {
          "type": [ "string", "null" ],
          "description": "The advisor's manager email'"
        }
      },
      "required": [ "Name", "Location", "Age" ]
    },
    "ClientData": {
      "type": "object",
      "description": "Customer's information",
      "additionalProperties": false,
      "properties": {
        "Title": {
          "type": [ "string", "null" ]
        },
        "Forename": {
          "type": "string"
        },
        "Surname": {
          "type": [ "string" ]
        }
      },
      "required": [ "Title" ],
      "if": {
        "properties": {
          "Forename": { "enum": [ "Someone" ] }
        },
        "required": [ "Forename" ]
      },
      "then": { "required": [ "Surname" ] },
      "else": {}
    }
  }
}

唯一的增加是对包含多个子项的错误进行GetReadableResult递归。

票数 1
EN

Stack Overflow用户

发布于 2022-02-13 22:29:13

在JSON模式中,如果我设置了“姓氏”:{“type”:“string”,"null},则错误消失

具有空值的属性仍然有一个值。如果您想说属性值不仅存在,而且不为null,那么将"type": "string"添加到then条件中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71091757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档