Json Schema的使用


直接上案例:

在Web Api通訊中,客戶端發送json數據,服務端反序列化json(json與某個類形成對應關系),在某些情況下,需要校驗其上傳的json是否合法。

服務端是使用Json.net(newtonsoft.json)進行反序列化。一般我們反序列化json為對象時代碼如下:

    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 }

通過調試,結果正確:

 

 

 然而,下面這個json反序列化也正確

{ "Id": 1, "Name": "張三", "Age": 20, "Height":170 }

然而這並非我們想要的結果,需要限制不能有額外的key-value (鍵值對,下同),否則需要反序列化時拋出異常。 為了達到此目的,可以通過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的情況下反序列化的讓其失敗,然后捕獲異常進行后續的處理的方法。 但還有一種就是json中缺少某對key-value的情況下序列化的問題, 示例json如下:

{ "Id": 1, "Name": "張三" }

從調試的結果看能正常反序列化,但Age為默認值0。 但在實際的過程中需要校驗是否為完整的json(不能缺少某個key-value),如果不是完整的json,則不能反序列化,為了達到這個目地,此處使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM