直接上案例: 在Web Api通訊中,客戶端發送json數據,服務端反序列化json(json與某個類形成對應關係),在某些情況下,需要校驗其上傳的json是否合法。 服務端是使用Json.net(newtonsoft.json)進行反序列化。一般我們反序列化json為對象時代碼如下: json原型 ...
直接上案例:
在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