• .NET 项目使用 JSON Schema


    背景:公司多个微服务应用程序的配置文件 appsettings.json 的内容转移到数据库中保存,程序从数据库中获取相关配置信息。

    方案:

    一、建立每一项配置的映射表。主要字段有ID,ITEM_KEY,ITEM_VALUE,ITEM_DESC,CREATETIME等。即将每一个配置项映射为数据库表的一行数据。

    二、建立每一个 json 文件的映射表。主要字段有ID,FILE_KEY,FILE_VALUE,FILE_DESC,CREATETIME等。即将每一个配置文件映射为数据库表的一行数据。其中,字段 FILE_VALUE 存放 json 格式的字符串。
    这种方案重点在于如何验证 FILE_VALUE 字段内容是否为json格式。

    这也有两种方案。
    1、建立每一个文件的映射实体类。反序列化之后再序列化成 json 字符串,在结构上保证了字段 FILE_VALUE 内容是 json 格式。

    var jsonString = "{\"Name\":\"李四\",\"PhoneNumber\":\"18166667777\",\"Zone\":\"Commerial\"}";
    var person = JsonConvert.DeserializeObject(jsonString);
    jsonString = JsonConvert.SerializeObject(person);

    2、采用 JSON Schema 的方式来验证 json 格式。
    2.1、百度一下什么是 json Schema:
    json schema 是描述你的JSON数据格式;JSON模式(应用程序/模式+ JSON)有多种用途,其中之一就是实例验证。验证过程可以是交互式或非交互式的。

    json Schema的结构描述:

    {
    "type": "object",
    "properties": {
    "Name": {
    "type": "string",
    "maxLength": 100
    },
    "PhoneNumber": {
    "type": "string",
    "format": "phone"
    },
    "Zone": {
    "type": "string",
    "enum": [
    "Residential",
    "Commercial",
    "Industrial"
    ]
    }
    },
    "required": [
    "Name",
    "PhoneNumber",
    "Zone"
    ]
    }


    它也是 json 格式,是描述约束 json 格式的 json。
    type,properties,required 从字面上就可以略知一二了。

    2.2、想要更详细的深入的了解,请参考:
    https://www.cnblogs.com/dreamyu/p/9317721.html

    2.3、如何生成我们想要的 json 格式的 json schema 呢?
    2.3.1 创建类(appsettings.json 文件映射实体类):

    类名为:Person

    public class Person {
    [Required]
    [MaxLength(100)]
    public string Name { get; set; }

    [Required]
    [Phone]
    public string PhoneNumber { get; set; }

    [Required]
    [EnumDataType(typeof(BuildingZone))]
    public string Zone { get; set; }
    }

    DataTypeAttribute 类 请参考:
    https://docs.microsoft.com/zh-cn/dotnet/api/system.componentmodel.dataannotations.datatypeattribute?view=net-6.0

    2.3.2 使用 JSchema 类,得到 schema 。
    需安装包 Newtonsoft.Json.Schema 。然后添加两个引用:
    using Newtonsoft.Json.Schema;
    using Newtonsoft.Json.Schema.Generation;

    JSchemaGenerator generator = new JSchemaGenerator();
    JSchema schema = generator.Generate(typeof(类名));
    //JSchema schema = generator.Generate(typeof(Person));

    得到的 schema 为:

    {
    "type": "object",
    "properties": {
    "Name": {
    "type": "string",
    "maxLength": 100
    },
    "PhoneNumber": {
    "type": "string",
    "format": "phone"
    },
    "Zone": {
    "type": "string",
    "enum": [
    "Residential",
    "Commercial",
    "Industrial"
    ]
    }
    },
    "required": [
    "Name",
    "PhoneNumber",
    "Zone"
    ]
    }


    2.3.3 使用一个工具,得到 appsettings.json 文件的 json 内容:

    https://form.lljj.me/index.html#/demo?ui=VueElementForm&type=Simple

    得到的 json 内容:
    {
    "Name": "赵五",
    "PhoneNumber": "18188889999",
    "Zone": "Residential"
    }


    2.3.4 后台验证 json 格式,得到验证结果:

    var person = JObject.Parse(jsonString);
    bool isJson = person.IsValid(schema);
    isJson 就是验证结果了。

    总结:
    json schema 全方位定义了 json 格式,包括结构,字段类型,字段长度,字段格式,枚举值,必填字段等等。可以实现验证严格约束 json 格式。
    采用何种验证方式,具体情况视项目需求而定。

  • 相关阅读:
    对Cost (%CPU) 粗略的理解
    SQL AND & OR 运算符
    [Nagios] Error: Template 'timman' specified in contact definition could not be not found (c
    质因数分解
    细数人体器官仿生,还有哪些可开发的
    利用京东云擎架设免费Wordpress 博客(git方式)
    C++内存管理变革(6):通用型垃圾回收器
    二分查找法
    百度云存储教程---免费建立自己的静态网站
    paip.提升效率---filter map reduce 的java 函数式编程实现
  • 原文地址:https://www.cnblogs.com/johsan/p/16265884.html
Copyright © 2020-2023  润新知