.net 專案使用 JSON Schema

usday發表於2022-05-12

.net 專案使用 JSON Schema


最近公司要做配置項的改造,要把appsettings.json的內容放到資料庫,經過分析還是用json的方式儲存最為方便,專案改動性最小,這就牽扯到一個問題,怎麼驗證json的格式:

最終考慮兩種方案供大家參考:

第一,建立對應的實體類,反序列化之後再序列化成json字串,這樣可以在結構上保證對應json串的格式不出錯,但是不好驗證內容的正確性。一定程度上保證了資料的正確性,再加上使用這個功能的人員也都是相關的技術人員,有一定的可行性。程式碼上的快,人一定很帥,上程式碼:

 var jsonStr = "{\"Name\":\"你好\",\"PhoneNumber\":\"170*****889\",\"Zone\":\"Commerial\"}";
 var build = JsonConvert.DeserializeObject(jsonStr); 
 jsonStr = JsonConvert.SerializeObject(build);

第二,JSON Schema的方式來驗證json格式,那簡直就是為你而生為你而來,什麼是json schema呢?我們們先通過下面好好了解一下:

>(百度百科) 什麼是json Schema:
jsonschema是描述你的JSON資料格式;JSON模式(應用程式/模式+ JSON)有多種用途,其中之一就是例項驗證。驗證過程可以是互動式或非互動式的。

話不多說,先上程式碼,讓我們一睹她的面容:

{
  "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格式的json。
那我們就開始對這個json分解,慢慢欣賞.
type,properties,required都是幹嘛的呢?
先留給你們幾分鐘自己瞭解下:
https://www.cnblogs.com/dreamyu/p/9317721.html

看到這裡,想必大家對json Schema不再陌生了吧。是不是更想了解她,得到她呢?下面我就給大家介紹一個工具來生成她,程式設計師做夢都想的一個事情就是new一個女朋友,這就來了:

 JSchemaGenerator generator = new JSchemaGenerator();
 JSchema schema = generator.Generate(typeof(類名));

這裡以Newtonsoft.Json.Schema為例子:

類名舉個例子為:Building

  public class Building {
        [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

生成的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"
  ]
}

這是這麼簡單就得到了我們的女主角schema, 讓我們的schema生出我們對應的json吧。還需要一個工具:

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

拿到我們的json資料:

{
    "Name": "張三",
    "PhoneNumber": "18856881888",
    "Zone": "Residential"
}

怎麼驗證到底是不是親生的呢?肯定要後臺驗證了:

  var person = JObject.Parse(json);
  bool valid = person.IsValid(schema);

valid 就是化驗結果了,此時拿到結果的我確有點猶豫了。。。

相關文章