【问题标题】:Deserialize JSON only if it specifies a value for a value type property仅当它为值类型属性指定值时才反序列化 JSON
【发布时间】:2023-03-29 03:20:01
【问题描述】:

如果我有一个包含值类型属性的 DTO 类,我如何习惯性地使用 Newtonsoft 将 JSON 反序列化为我的 DTO 类,同时确保 JSON 定义值类型,可能包含该类型的 default 值?到目前为止,我看到的方法依赖于检查该值是否为 default 值,但是,当 default 值也是该属性的有效值时,这不是一个合适的解决方案。

示例

public class MyDto
{
    public bool MyProp { get; set; }
}
JSON Can deserialize to MyDto
{"MyProp": true} true
{"MyProp": false} true
{} false

当前解决方案

目前我使用System.ComponentModel.DataAnnotations.RequiredAttribute并将类型声明为可为空,但这仅在模型绑定期间有效(而不是任何反序列化),并导致在引用属性时过度使用!

public class MyDto
{
    [Required]
    public bool? MyProp { get; set; }
}

【问题讨论】:

  • 当 JSON 为 {} 时,你想发生什么?
  • 反序列化器应该不会成功。如果是 ApiController 模型,客户端应该收到 400,如果是 JsonConvert 调用,它应该抛出。
  • 我们需要查看您的 ApiController 甚至是完全可重现的示例。否则很难弄清楚到底是什么问题。

标签: c# .net json.net deserialization json-deserialization


【解决方案1】:

您可以像这样使用 JSON Schema (Newtonsoft.Json.Schema) 验证 JSON:

public class MyDto
{
    [JsonProperty(Required = Required.Always)]
    public bool MyProp { get; set; }
}


var generator = new JSchemaGenerator();
var schema = generator.Generate(typeof(MyDto));
var dto = JObject.Parse(@"{ 'MyProp': true }");
bool isValid = dto.IsValid(schema);
Console.WriteLine(isValid); // True

dto = JObject.Parse(@"{}");
isValid = dto.IsValid(schema);
Console.WriteLine(isValid); // False

【讨论】:

    【解决方案2】:

    我相信您正在寻找的是 JsonPropertyAttribute Required 属性:

    public class MyDto
    {
        [JsonProperty(Required = Required.Always)]
        public bool MyProp { get; set; }
    }
    

    当被反序列化的 JSON 不包含指定的属性 (MyProp) 时,这会导致异常。例如:

    string json = "{\"MyProp\": true}";
    MyDto myDto = JsonConvert.DeserializeObject<MyDto>(json);
    Console.WriteLine(myDto.MyProp);
    
    json = "{\"MyProp\": false}";
    myDto = JsonConvert.DeserializeObject<MyDto>(json);
    Console.WriteLine(myDto.MyProp);
    
    json = "{}";
    myDto = JsonConvert.DeserializeObject<MyDto>(json);
    Console.WriteLine(myDto.MyProp);
    

    给出结果:

    True
    False
    Run-time exception (line 17): Required property 'MyProp' not found in JSON. Path '', line 1, position 2.
    

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      相关资源
      最近更新 更多