NewtonSoft.Json将空白值视为Null但不引发错误

pinkon5k  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(241)

环境

  • 互联网7
  • 同时使用System.Text.Json
  • 也作牛顿软件. Json(13.0.2)

示例代码

string str = @"{
    ""DateTimeNull"":""""
}";
try
{
    var t = System.Text.Json.JsonSerializer.Deserialize<Test>(str);
}
catch (JsonException ex) 
{
    Console.WriteLine(new { Field = ex.Path , Message = ex.Message });
}

try
{
    var t = Newtonsoft.Json.JsonConvert.DeserializeObject<Test>(str);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

public class Test
{
    public DateTime? DateTimeNull { get; set; }
}

在上面的System.Text.Json反序列化器抛出异常,但newtansoft.json行没有抛出任何异常。它正在将空值转换为null,但我希望它应该thow错误,由于限制,我不能移动到System.Text.Json截至目前。

  • 有效负载(这是已经在str中设置的i)
  • 样品一
@"{
    ""DateTimeNull"":""""
}";

预期结果:引发错误,不应转换为null。

  • 样本二。
@"{
    ""DateTimeNull"": null
}";

预期结果:不应引发错误,并且该错误为空值且目标类型为空。

xxslljrj

xxslljrj1#

我通常推荐使用JsonConstructor

var json = @"{
    ""DateTimeNull"":""""
}";

Test test = JsonConvert.DeserializeObject<Test>(json);

public class Test
{
    public DateTime? DateTimeNull { get; set; }
    
    [Newtonsoft.Json.JsonConstructor]
    public Test(JToken DateTimeNull)
    {
        if (DateTimeNull.Type == JTokenType.Null) this.DateTimeNull = null;
        else if ((string)DateTimeNull == string.Empty)
            throw new JsonException("DateTimeNull property should not be an empty string");
        else this.DateTimeNull = DateTimeNull.ToObject<DateTime>();
    }
}

相关问题