直接上案例:json
在Web Api通信中,客户端发送json数据,服务端反序列化json(json与某个类造成对应关系),在某些状况下,须要校验其上传的json是否合法。spa
服务端是使用Json.net(newtonsoft.json)进行反序列化。通常咱们反序列化json为对象时代码以下:.net
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 }
经过调试,结果正确:code
然而,下面这个json反序列化也正确对象
{ "Id": 1, "Name": "张三", "Age": 20, "Height":170 }
然而这并不是咱们想要的结果,须要限制不能有额外的key-value (键值对,下同),不然须要反序列化时抛出异常。 为了达到此目的,能够经过JsonSerializerSettings的MissingMemberHandling为MissingMemberHandling.Error:blog
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以下:token
{ "Id": 1, "Name": "张三" }
从调试的结果看能正常反序列化,但Age为默认值0。 但在实际的过程当中须要校验是否为完整的json(不能缺乏某个key-value),若是不是完整的json,则不能反序列化,为了达到这个目地,此处使用newtonsoft.Json.Schema.get
首先,安装并添加引用原型
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();