• Json Schema高性能.net实现库 LateApexEarlySpeed.Json.Schema - 直接从code生成json schema validator


    LateApexEarlySpeed.Json.Schema - Json schema validator generation from .net type

    除了用户手动传入标准的json schema来生成validator以外,LateApexEarlySpeed.Json.Schema 实现库也支持直接从用户代码中生成json schema validator.

    基本用法

    JsonValidator validator = JsonSchemaGenerator.GenerateJsonValidator();
    
    // 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用法:

    class TestClass
    {
        [Maximum(2)]
        public int Prop { get; set; }
    
        [LengthRange(10, 20)]
        [Pattern("*abc*")]
        public string StringProp { get; set; }
    }
    

    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:

    class CustomNamedPropertyTestClass
        {
            [JsonPropertyName("NewPropName")]
            public int Prop { get; set; }
        }
    

    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:

    internal class YourNamingPolicy : JsonSchemaNamingPolicy
    {
        public override string ConvertName(string name)
        {
            // convert and return new name.
        }
    }
    

    用option来自定义property naming policy:

    JsonValidator validator = JsonSchemaGenerator.GenerateJsonValidator(type, new JsonSchemaGeneratorOptions { PropertyNamingPolicy = JsonSchemaNamingPolicy.CamelCase }));
    

    Note: 当对某类属性指定了 JsonPropertyNameAttribute,同时又在option中指定了自定义 PropertyNamingPolicy, 则那个属性将使用JsonPropertyNameAttribute,其他属性将使用option.

    Issue report

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

  • 相关阅读:
    自主SSL品牌—JoySSL
    一键搞定centos7的docker+selenium+appium+jenkins+android_app源码打包成apk的环境搭建
    html- a标签包裹img标签, 点击图片无法跳转问题记录及解决方法
    C语言实现冒泡排序(图解)
    Google Earth Engine(GEE)——用reducers来获取某一个区域得响应值并转化为列
    Axios七大特性
    [附源码]java毕业设计游戏网站设计
    opencv用自适应直方图均衡化函数cv2.createCLAHE()提高对比度
    蓝桥杯备战刷题five(自用)
    Docker 安装Oracle 11g免费版—无坑小白白版(值得拥有)
  • 原文地址:https://www.cnblogs.com/dotnet-diagnostic/p/17997545