不幸的是JObject.Parse不讓你改變任何東西。
首先,您設置架構。 JSchema創建一個屬性的內部字典。
JSchema schema = generator.Generate(typeof(MyClass));
schema.AllowAdditionalProperties = false;
schema.UniqueItems = false;
我已經添加了自己的表示法來測試它並執行類的反序列化。
string MyJson = "{\"PROPERTYONE\":\"Data\", \"PropertyTwo\":10}";
類是故意不匹配這個定義
public class MyClass
{
public string PropertyOne { get; set; }
public int PropertyTwo { get; set; }
}
內部讀者創建,您的字符串傳遞,並從你的定義得到驗證架構讀者:
JsonTextReader reader = new JsonTextReader(new StringReader(MyJson));
JSchemaValidatingReader validatingReader = new JSchemaValidatingReader(reader);
validatingReader.Schema = JSchema.Parse(schema.ToString());
我已經創建了消息手動掛鉤到觸發驗證讀取器中的每個驗證的事件中,因此您可以獲取驗證消息:
IList<string> messages = new List<string>();
validatingReader.ValidationEventHandler += (o, a) => messages.Add(a.Message);
如果使用串行反序列化類它的工作原理,並填充類,因爲反序列化並不關心的外殼,但您的驗證讀取器會冒泡驗證失敗
JsonSerializer serializer = new JsonSerializer();
MyClass p = serializer.Deserialize<MyClass>(validatingReader);
裏面的驗證過程您的驗證在下面的部分失敗的:
private bool IsPropertyDefinied(JSchema schema, string propertyName)
{
if (schema._properties != null && schema._properties.ContainsKey(propertyName))
{
return true;
}
...
屬性名相比字典。這個字典是一個普通字典,它沒有使用屬性InvariantCultureIgnoreCase,它會使它比較正確(按照你的要求) 唯一的方法是獲取GitHub代碼並更新它以支持你的功能,直到那時不可能獲得你所需要的東西。