在找到额外字段时使用newtowsoft反序列化为自定义对象时抛出异常

时间:2018-01-23 21:41:50

标签: c# json json.net

我有简单的课程:

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");}
}

但这是非常难看的黑客。

1 个答案:

答案 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文档