gpt4 book ai didi

C# JsonConvert 转换无效对象

转载 作者:行者123 更新时间:2023-11-30 23:13:41 26 4
gpt4 key购买 nike

我创建了一个简单的类:

public class TestObject
{
public TestObject(int id, string name, List<string> list)
{
this.Id = id;

if (name == null)
{
throw new ArgumentException();
}
this.Name = name;
this.List = list;
}

[Required]
public int Id { get; }

public string Name { get; }

public List<string> List { get; }
}

我想反序列化并验证原始 JSON 是否正确:

[Test]
public void MissingIdArgument()
{
var str = @"{ ""name"": ""aa"" } ";
Assert.Throws<JsonSerializationException>(() =>
JsonConvert.DeserializeObject<TestObject>(
str,
new JsonSerializerSettings()
{
CheckAdditionalContent = true,
DefaultValueHandling = DefaultValueHandling.Include,
MissingMemberHandling = MissingMemberHandling.Error,
NullValueHandling = NullValueHandling.Include,

}));
}

我希望这个测试能通过,但它没有。它不检查 IdList 字段是否甚至存在于原始 JSON 中(尽管需要 Id 字段)。向 JSON 添加一些随机属性会导致实际抛出异常。

如何使 JsonConvert 在这个测试(按原样)能够通过的意义上变得严格?

准确地说,我希望:

  • { id: 1, name: "aa"} - 失败(因为没有定义列表)
  • { name: "aa", list: null } - 失败(因为没有定义 id)
  • { id: 0, name: "", list: null } - 通过

最佳答案

我会说您以错误的方式指定了所需的属性。

您应该使用JsonProperty attributeRequired property 而不是 Required 属性。

例如:

public class TestObject
{
// Id has to be present in the JSON
[JsonProperty(Required = Required.Always)]
public int Id { get; }

// Name is optinional
[JsonProperty]
public string Name { get; }

// List has to be present in the JSON but may be null
[JsonProperty(Required = Required.AllowNull)]
public List<string> List { get; }
}

Required 属性可以设置为 Newtonsoft.Json.Required enum 中的常量.

检查 JsonPropertyAttribute class documentation其他配置的可能性。

您还可以检查 example在官方文档中。

关于C# JsonConvert 转换无效对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43495984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com