翼度科技»论坛 编程开发 .net 查看内容

Json Schema高性能.net实现库 LateApexEarlySpeed.Json.Schema - 直接从cod

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
LateApexEarlySpeed.Json.Schema - Json schema validator generation from .net type

除了用户手动传入标准的json schema来生成validator以外,LateApexEarlySpeed.Json.Schema 实现库也支持直接从用户代码中生成json schema validator.
基本用法
  1. JsonValidator validator = JsonSchemaGenerator.GenerateJsonValidator<TestClass>();
  2. // Now use validator instance as normal
复制代码
目前为止支持的.net类型

Numeric types: byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal.
Boolean, String, Dictionary, JsonElement, JsonDocument, JsonNode, JsonValue, JsonArray, JsonObject, generic type of IEnumerable, Enum, Guid, Uri, DateTimeOffset, DateTime, Nullable value type (generic type of Nullable), Custom object.
目前为止支持的validation attributes

LateApexEarlySpeed.Json.Schema实现库支持通过attributes来表示需要的数据限制。查看各attributes的构造函数的参数应该就可以了解其作用:

  • EmailAttribute
  • ExclusiveMaximumAttribute
  • ExclusiveMinimumAttribute
  • MaximumAttribute
  • MinimumAttribute
  • MultipleOfAttribute
  • StringEnumAttribute
  • IntegerEnumAttribute
  • IPv4Attribute
  • IPv6Attribute
  • LengthRangeAttribute (for both string length and array length)
  • MaxLengthAttribute (for both string length and array length)
  • MinLengthAttribute (for both string length and array length)
  • UniqueItemsAttribute (for array)
  • NumberRangeAttribute
  • PatternAttribute (for string)
attribute用法:
  1. class TestClass
  2. {
  3.     [Maximum(2)]
  4.     public int Prop { get; set; }
  5.     [LengthRange(10, 20)]
  6.     [Pattern("*abc*")]
  7.     public string StringProp { get; set; }
  8. }
复制代码
Nullable

默认情况下,library会认为所有reference类型为可空。如果你希望指定某引用类型的属性不能为空,可以给这个属性加[LateApexEarlySpeed.Json.Schema.Generator.NotNullAttribute]
Required or ignored

默认情况下,当json数据中出现要验证的类属性时,library才会验证这个json中的属性的值。
如果你希望验证某属性必须出现在json数据中,可以给这个属性加[System.Text.Json.Serialization.JsonRequiredAttribute] 或 [System.ComponentModel.DataAnnotations.RequiredAttribute]
如果你希望library忽略对于某个属性的验证,可以给这个属性加[System.Text.Json.Serialization.JsonIgnoreAttribute]
library为这种需求设计为复用.net core默认自带的attribute,是为了尽可能让用户代码有一致体验。
自定义属性名

和System.Text.Json类似, library支持通过attribute和option来提供用户定义的属性名称:
System.Text.Json.Serialization.JsonPropertyNameAttribute:
  1. class CustomNamedPropertyTestClass
  2.     {
  3.         [JsonPropertyName("NewPropName")]
  4.         public int Prop { get; set; }
  5.     }
复制代码
JsonSchemaNamingPolicy options:

  • JsonSchemaNamingPolicy.CamelCase:
    First word starts with a lower case character. Successive words start with an uppercase character. TempCelsius        => tempCelsius
  • JsonSchemaNamingPolicy.KebabCaseLower: Words are separated by hyphens. All characters are lowercase. TempCelsius        -> temp-celsius
  • JsonSchemaNamingPolicy.KebabCaseUpper: Words are separated by hyphens. All characters are uppercase. TempCelsius        => TEMP-CELSIUS
  • JsonSchemaNamingPolicy.SnakeCaseLower: Words are separated by underscores. All characters are lowercase. TempCelsius        -> temp_celsius
  • JsonSchemaNamingPolicy.SnakeCaseUpper: Words are separated by underscores. All characters are uppercase. TempCelsius        -> TEMP_CELSIUS
  • JsonSchemaNamingPolicy.SharedDefault: default option, not change original property name
  • 也可以写自己需要的其他JsonSchemaNamingPolicy:
  1. internal class YourNamingPolicy : JsonSchemaNamingPolicy
  2. {
  3.     public override string ConvertName(string name)
  4.     {
  5.         // convert and return new name.
  6.     }
  7. }
复制代码
用option来自定义property naming policy:
  1. JsonValidator validator = JsonSchemaGenerator.GenerateJsonValidator(type, new JsonSchemaGeneratorOptions { PropertyNamingPolicy = JsonSchemaNamingPolicy.CamelCase }));
复制代码
Note: 当对某类属性指定了 JsonPropertyNameAttribute,同时又在option中指定了自定义 PropertyNamingPolicy, 则那个属性将使用JsonPropertyNameAttribute,其他属性将使用option.
Issue report

使用中遇到任何问题,或者希望增加的功能,欢迎提到doc repo issue中。

来源:https://www.cnblogs.com/dotnet-diagnostic/p/17997545
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

上一篇: 9.附加属性

下一篇: 8.依赖属性

举报 回复 使用道具