.NET 項(xiàng)目使用 JSON Schema
????最近公司要做配置項(xiàng)的改造,要把a(bǔ)ppsettings.json的內(nèi)容放到數(shù)據(jù)庫(kù),經(jīng)過(guò)分析還是用json的方式存儲(chǔ)最為方便,項(xiàng)目改動(dòng)性最小,這就牽扯到一個(gè)問(wèn)題,怎么驗(yàn)證json的格式:
最終考慮兩種方案供大家參考:
第一,建立對(duì)應(yīng)的實(shí)體類(lèi),反序列化之后再序列化成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的方式來(lái)驗(yàn)證json格式,那簡(jiǎn)直就是為你而生為你而來(lái),什么是json schema呢?咱們先通過(guò)下面好好了解一下:
>(百度百科) 什么是json Schema:
jsonschema是描述你的JSON數(shù)據(jù)格式;JSON模式(應(yīng)用程序/模式+ JSON)有多種用途,其中之一就是實(shí)例驗(yàn)證。驗(yàn)證過(guò)程可以是交互式或非交互式的。
話(huà)不多說(shuō),先上代碼,讓我們一睹她的面容:
{"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。
那我們就開(kāi)始對(duì)這個(gè)json分解,慢慢欣賞.
type,properties,required都是干嘛的呢?
先留給你們幾分鐘自己了解下:
https://www.cnblogs.com/dreamyu/p/9317721.html
看到這里,想必大家對(duì)json Schema不再陌生了吧。是不是更想了解她,得到她呢?下面我就給大家介紹一個(gè)工具來(lái)生成她,程序員做夢(mèng)都想的一個(gè)事情就是new一個(gè)女朋友,這就來(lái)了:
JSchemaGenerator generator = new JSchemaGenerator();JSchema schema = generator.Generate(typeof(類(lèi)名));
這里以Newtonsoft.Json.Schema為例子:
類(lèi)名舉個(gè)例子為:Building
public class Building {[][]public string Name { get; set; }[][]public string PhoneNumber { get; set; }[][]public string Zone { get; set; }}
DataTypeAttribute 類(lèi) 請(qǐng)參考:
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"]}
這是這么簡(jiǎn)單就得到了我們的女主角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);
MIPSASM復(fù)制全屏
valid 就是化驗(yàn)結(jié)果了,此時(shí)拿到結(jié)果的我確有點(diǎn)猶豫了。。。
出處:https://www.cnblogs.com/mulaba/p/16264557.html
版權(quán)聲明:本文來(lái)源于網(wǎng)友收集或網(wǎng)友提供,僅供學(xué)習(xí)交流之用,如果有侵權(quán),請(qǐng)轉(zhuǎn)告版主或者留言,本公眾號(hào)立即刪除。
支持小薇騰訊云福利?:
?爆款2核2G云服務(wù)器首年50元,2G2核5M云服務(wù)器259元/3年
鏈接:https://curl.qcloud.com/1VVs7OBH
關(guān)注:DotNet開(kāi)發(fā)跳槽
?????????????????????????????????????????????????????????????
??
覺(jué)得不錯(cuò),請(qǐng)點(diǎn)個(gè)在看
呀
