使用Newtonsoft.Json反序列化空对象

bis0qfac  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(156)

我有课

class Temp {
    public string Field1 { get; set; }
    public int Field2 { get; set; }
    public bool Field3 { get; set; }
    ...
}

在某些情况下,在我的程序“{}”字符串反序列化为Temp类与Newtonsoft.Json,即

var obj = JsonConvert.DeserializeObject("{}", typeof(Temp));

我希望得到null或exception,但我得到了一个Temp类的示例,它具有默认值,即

{
    Field1: "",
    Field2: 0,
    Field3: false,
}

我可以改变这种行为吗?

hxzsmxv2

hxzsmxv21#

您可以使用Json.Net Schema来确保收到的json包含您需要的所有内容。
这里有一个简单的应用程序如何使用它

static JSchemaGenerator generator = new();
static JSchema schema = generator.Generate(typeof(Temp));
public static void Main()
{
    var jsons = new[] {
        "{}",
        "{'Field1': \"1\"}",
        "{'Field1': \"1\", 'Field2': 2}",
        "{'Field1': \"1\", 'Field2': 2, 'Field3': 'false'}",
        "{'Field1': \"1\", 'Field2': 2, 'Field3': false}",
        "{'Field1': \"1\", 'Field2': 2, 'Field3': false, 'Field4': 4.0}",
    };
    
    foreach(var json in jsons)
    {
        var semiParsedJson = JObject.Parse(json);
        Console.WriteLine($"{json} is valid: {semiParsedJson.IsValid(schema)}");
    }
}

这是输出

{} is valid: False
{'Field1': "1"} is valid: False
{'Field1': "1", 'Field2': 2} is valid: False
{'Field1': "1", 'Field2': 2, 'Field3': 'false'} is valid: False
{'Field1': "1", 'Field2': 2, 'Field3': false} is valid: True
{'Field1': "1", 'Field2': 2, 'Field3': false, 'Field4': 4.0} is valid: True

Dotnet Fiddle link

相关问题