在.net項(xiàng)目使用JSONSchema示例詳解
最近公司要做配置項(xiàng)的改造,要把a(bǔ)ppsettings.json的內(nèi)容放到數(shù)據(jù)庫,經(jīng)過分析還是用json的方式存儲(chǔ)最為方便,項(xiàng)目改動(dòng)性最小,這就牽扯到一個(gè)問題,怎么驗(yàn)證json的格式:
最終考慮兩種方案供大家參考:
第一,建立對(duì)應(yīng)的實(shí)體類,反序列化之后再序列化成json字符串,這樣可以在結(jié)構(gòu)上保證對(duì)應(yīng)json串的格式不出錯(cuò),但是不好驗(yàn)證內(nèi)容的正確性。一定程度上保證了數(shù)據(jù)的正確性,再加上使用這個(gè)功能的人員也都是相關(guān)的技術(shù)人員,有一定的可行性。代碼上的快,人一定很帥,上代碼:
var jsonStr = "{\"Name\":\"你好\",\"PhoneNumber\":\"170*****889\",\"Zone\":\"Commerial\"}"; var build = JsonConvert.DeserializeObject(jsonStr); jsonStr = JsonConvert.SerializeObject(build);
第二,JSON Schema的方式來驗(yàn)證json格式,那簡直就是為你而生為你而來,什么是json schema呢?咱們先通過下面好好了解一下:
(百度百科) 什么是json Schema:
jsonschema是描述你的JSON數(shù)據(jù)格式;JSON模式(應(yīng)用程序/模式+ JSON)有多種用途,其中之一就是實(shí)例驗(yàn)證。驗(yàn)證過程可以是交互式或非交互式的。
話不多說,先上代碼,讓我們一睹她的面容:
{ "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嗎,還搞得這么神秘?
對(duì),就是json,是描述json格式的json。
那我們就開始對(duì)這個(gè)json分解,慢慢欣賞.
type,properties,required都是干嘛的呢?
先留給你們幾分鐘自己了解下:
http://www.dbjr.com.cn/article/247934.htm
看到這里,想必大家對(duì)json Schema不再陌生了吧。是不是更想了解她,得到她呢?下面我就給大家介紹一個(gè)工具來生成她,程序員做夢(mèng)都想的一個(gè)事情就是new一個(gè)女朋友,這就來了:
JSchemaGenerator generator = new JSchemaGenerator(); JSchema schema = generator.Generate(typeof(類名));
這里以Newtonsoft.Json.Schema為例子:
類名舉個(gè)例子為: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 類 請(qǐng)參考:
生成的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生出我們對(duì)應(yīng)的json吧。還需要一個(gè)工具:
https://form.lljj.me/index.html#/demo?ui=VueElementForm&type=Simple
拿到我們的json數(shù)據(jù):
{ "Name": "張三", "PhoneNumber": "18856881888", "Zone": "Residential" }
怎么驗(yàn)證到底是不是親生的呢?肯定要后臺(tái)驗(yàn)證了:
var person = JObject.Parse(json); bool valid = person.IsValid(schema);
valid 就是化驗(yàn)結(jié)果了,此時(shí)拿到結(jié)果的我確有點(diǎn)猶豫了,更多關(guān)于.net使用JSONSchema的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
asp.net實(shí)現(xiàn)上傳圖片時(shí)判斷圖片的模式GRB或CMYK的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)上傳圖片時(shí)判斷圖片的模式GRB或CMYK的方法,涉及asp.net針對(duì)圖片的讀取及屬性操作相關(guān)技巧,需要的朋友可以參考下2016-07-07asp.net GridView中使用RadioButton單選按鈕的方法
這篇文章主要介紹了asp.net GridView中使用RadioButton單選按鈕的方法,結(jié)合實(shí)例形式總結(jié)分析了三種GridView中使用RadioButton單選按鈕的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07Entity?Framework使用Fluent?API配置案例
本文詳細(xì)講解了Entity?Framework使用Fluent?API配置案例的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03關(guān)于ASP.NET頁面打印技術(shù)的常用方法總結(jié)
B/S結(jié)構(gòu)導(dǎo)致了Web應(yīng)用程序中打印的特殊性;程序運(yùn)行在瀏覽器中,打印機(jī)在本地,而文件確可能在服務(wù)器上,導(dǎo)致了打印控制不是很靈活,接下來介紹幾種常見的打印技術(shù),感興趣的朋友可以了解下2013-01-01ASP.Net PlaceHolder、Panel等控件未實(shí)現(xiàn)INamingContainer,導(dǎo)致FindContro
這2天在開發(fā)中發(fā)現(xiàn),如果在new的Panel中使用FindControl,會(huì)出現(xiàn)找不到控件的情況2009-06-06獲取根目錄的URL例如http://localhost:51898
這篇文章主要介紹了獲取根目錄的URL的方法,需要的朋友可以參考下2014-02-02