Json Schema的使用
直接上案例:
在Web?Api通訊中,客戶端發(fā)送json數(shù)據(jù),服務(wù)端反序列化json(json與某個(gè)類形成對應(yīng)關(guān)系),在某些情況下,需要校驗(yàn)其上傳的json是否合法。
服務(wù)端是使用Json.net(newtonsoft.json)進(jìn)行反序列化。一般我們反序列化json為對象時(shí)代碼如下:
class Program{static void Main(string[] args){string str = "{\"Id\":1,\"Name\":\"張三\",\"Age\":20}";Person p = JsonConvert.DeserializeObject<Person>(str);Console.ReadKey();}}internal class Person{public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }}json原型是:
{"Id": 1,"Name": "張三","Age": 20 }通過調(diào)試,結(jié)果正確:
?
?
?然而,下面這個(gè)json反序列化也正確
{"Id": 1,"Name": "張三","Age": 20,"Height":170 }
然而這并非我們想要的結(jié)果,需要限制不能有額外的key-value (鍵值對,下同),否則需要反序列化時(shí)拋出異常。?為了達(dá)到此目的,可以通過JsonSerializerSettings的MissingMemberHandling為MissingMemberHandling.Error:
string str = "{\"Id\":1,\"Name\":\"張三\",\"Age\":20,\"Height\":170}"; JsonSerializerSettings settings = new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Error }; Person p = JsonConvert.DeserializeObject<Person>(str,settings); Console.ReadKey();
?
上面是json中有多余key-value的情況下反序列化的讓其失敗,然后捕獲異常進(jìn)行后續(xù)的處理的方法。 但還有一種就是json中缺少某對key-value的情況下序列化的問題, 示例json如下:
{"Id": 1,"Name": "張三" }
從調(diào)試的結(jié)果看能正常反序列化,但Age為默認(rèn)值0。 但在實(shí)際的過程中需要校驗(yàn)是否為完整的json(不能缺少某個(gè)key-value),如果不是完整的json,則不能反序列化,為了達(dá)到這個(gè)目地,此處使用newtonsoft.Json.Schema.
首先,安裝并添加引用
string str = "{\"Id\":1,\"Name\":\"張三\"}"; JSchema schema = new JSchemaGenerator().Generate(typeof(Person)); JToken token = JToken.Parse(str); if (token.IsValid(schema)) {JsonSerializerSettings settings = new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Error };Person p = JsonConvert.DeserializeObject<Person>(str, settings); } else {Console.WriteLine("不是完整的json"); } Console.ReadKey();
?
參考資料:https://www.newtonsoft.com/jsonschema
更多專業(yè)前端知識,請上 【猿2048】www.mk2048.com
總結(jié)
以上是生活随笔為你收集整理的Json Schema的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web前端-回调函数sort详解
- 下一篇: jQuery表单验证的几种方法