如何使用JSON.NET检查JSON中的缺失字段

Cid*_*Cid 1 c# json json.net json-deserialization

我有这个JSON:

{
    "Foo": "A value",
    "Bar": 42
}
Run Code Online (Sandbox Code Playgroud)

要反序列化它,我有这个类:

public class SomeClass
{
    public string Foo { get; set; }
    public int Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下方法对其进行反序列化:

string json1 = "{\"Foo\":\"A value\",\"Bar\":42}";
var MyObj1 = JsonConvert.DeserializeObject<SomeClass>(json1);
Debug.WriteLine("Foo1 : " + MyObj1.Foo); //Foo1 : A value
Debug.WriteLine("Bar1 : " + MyObj1.Bar); //Bar1 : 42
Run Code Online (Sandbox Code Playgroud)

当JSON中缺少字段时,我需要特定的处理方法.

例如:

{
    "Foo": "Another value"
}
Run Code Online (Sandbox Code Playgroud)

当使用与上面相同的代码时,Bar设置为0.它可能在原始JSON中设置为0,因此如果它存在与否,我无法判断该值.

string json2 = "{\"Foo\":\"Another value\"}";
var MyObj2 = JsonConvert.DeserializeObject<SomeClass>(json2);
Debug.WriteLine("Foo2 : " + MyObj2.Foo); //Foo2 : Another value
Debug.WriteLine("Bar2 : " + MyObj2.Bar); //Bar2 : 0
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现它?

Jon*_*eet 5

最简单的选择是使其成为int?属性,然后检查值是否为null:

public class SomeClass
{
    public string Foo { get; set; }
    public int? Bar { get; set; }
}

...

var deserialized = JsonConvert.DeserializeObject<SomeClass>(json);
if (deserialized.Bar == null)
{
    // Whatever you want to do if it wasn't set
}
Run Code Online (Sandbox Code Playgroud)

当然,JSON可以显式地将值设置为null,但我希望您可能会乐意处理它,就像它丢失了一样.