我有简单的课程:
public class TestObject {
public string Label { get; set; } = string.Empty;
public double Number { get; set; } = 0;
}
我想从json获取TestObject的一个实例。诀窍是允许Label和Number属性是可选的,但是如果添加了任何额外的字段则抛出异常(以避免像“Lebel”这样的错误)。
下面的代码总是转换为TestObject:
var correctInput = $"{{\"Label\":\"a\", \"Number\":5 }}";
var incorrectInput = $"{{\"Labell\":\"a\", \"Numberr\":5 }}";
JToken obj1 = JsonConvert.DeserializeObject<dynamic>(correctInput);
JToken obj2 = JsonConvert.DeserializeObject<dynamic>(incorrectInput);
var correctResult = obj1.ToObject<TestObject>();
var incorrectResult = obj2.ToObject<TestObject>();
Console.WriteLine($"Label: {correctResult.Label} Number: {correctResult.Number}");
Console.WriteLine($"Label: {incorrectResult.Label} Number: {incorrectResult.Number}");
它的输出将是:
Label: a Number: 5
Label: Number: 0
我想到的唯一解决方案是使用属性[JsonExtensionData]定义额外字段并抛出异常以设置访问者:
[JsonExtensionData]
private IDictionary<string, JToken> _extraStuff {
get { return _extraStuff1; }
set { throw new Exception("cannot do it");}
}
但这是非常难看的黑客。
答案 0 :(得分:1)
我认为您需要设置MissingMemberHandling = MissingMemberHandling.Error
如果JSON中的Label属性拼写错误为'Labell'
var incorrectInput = $"{{\"Labell\":\"a\", \"Numberr\":5 }}";
JsonConvert.DeserializeObject<TestObject>(
incorrectInput,
new JsonSerializerSettings() { MissingMemberHandling = MissingMemberHandling.Error });
会强行抛出JsonSerializationException
:
'无法在'TestObject'类型的对象上找到成员'Labell'。
有关@ https://www.newtonsoft.com/json/help/html/DeserializeMissingMemberHandling.htm
的更多信息,请参阅Newtonsoft文档