在.net項目使用JSONSchema示例詳解
最近公司要做配置項的改造,要把appsettings.json的內(nèi)容放到數(shù)據(jù)庫,經(jīng)過分析還是用json的方式存儲最為方便,項目改動性最小,這就牽扯到一個問題,怎么驗證json的格式:
最終考慮兩種方案供大家參考:
第一,建立對應(yīng)的實體類,反序列化之后再序列化成json字符串,這樣可以在結(jié)構(gòu)上保證對應(yīng)json串的格式不出錯,但是不好驗證內(nèi)容的正確性。一定程度上保證了數(shù)據(jù)的正確性,再加上使用這個功能的人員也都是相關(guān)的技術(shù)人員,有一定的可行性。代碼上的快,人一定很帥,上代碼:
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數(shù)據(jù)格式;JSON模式(應(yīng)用程序/模式+ 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都是干嘛的呢?
先留給你們幾分鐘自己了解下:
http://www.fzitv.net/article/247934.htm
看到這里,想必大家對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 類 請參考:
生成的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生出我們對應(yīng)的json吧。還需要一個工具:
https://form.lljj.me/index.html#/demo?ui=VueElementForm&type=Simple

拿到我們的json數(shù)據(jù):
{
"Name": "張三",
"PhoneNumber": "18856881888",
"Zone": "Residential"
}
怎么驗證到底是不是親生的呢?肯定要后臺驗證了:
var person = JObject.Parse(json); bool valid = person.IsValid(schema);
valid 就是化驗結(jié)果了,此時拿到結(jié)果的我確有點猶豫了,更多關(guān)于.net使用JSONSchema的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
asp.net post方法中參數(shù)取不出來的解決方法
調(diào)試client端調(diào)用web api的代碼,服務(wù)器端的post方法的參數(shù)死活取不出來,下面有個不錯的解決方法,希望對大家有所幫助2014-01-01
.NET中應(yīng)用程序內(nèi)共享UdpClient聯(lián)機的實現(xiàn)方法
本篇文章介紹了,.NET中應(yīng)用程序內(nèi)共享UdpClient聯(lián)機的實現(xiàn)方法。需要的朋友參考下2013-05-05
.NET?Core?實現(xiàn)緩存的預(yù)熱的方式
本文介紹了緩存預(yù)熱在.NETCore應(yīng)用中的重要性以及如何實現(xiàn)緩存預(yù)熱,緩存預(yù)熱可以提升用戶體驗、降低數(shù)據(jù)庫壓力、提高系統(tǒng)穩(wěn)定性,感興趣的朋友一起看看吧2025-03-03
使用.NET Core創(chuàng)建exe應(yīng)用程序
這篇文章介紹了使用.NET Core創(chuàng)建exe應(yīng)用程序的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06

