使用Newtonsoft的c#未抛出异常



我有一个对象需要属性

public class EmailStructureRequestModel
{

[JsonProperty(PropertyName = "Sender", Required = Required.Always)]
public EmailSender Sender { get; set; }

[JsonProperty(PropertyName = "to", Required = Required.Always)]
public List<string> To { get; set; }

[JsonProperty(PropertyName = "Cc")]
public List<string> Cc { get; set; }

[JsonProperty(PropertyName = "Bcc")]
public List<string> Bcc { get; set; }

[JsonProperty(PropertyName = "Content", Required = Required.Always)]
public EmailContent Content { get; set; }
}

该对象应该包含允许发送电子邮件的所有信息。然后我尝试构建一个eMailStructure对象。为此,我使用Newtonsoft。Json

using (StreamReader r = new StreamReader(filePath))
{
string json = r.ReadToEnd();
EmailStructureRequestModel emailStructure =
JsonConvert.DeserializeObject<EmailStructureRequestModel>(json);
...
}

我的问题是JsonConvert不能正确地反序列化Json字符串。从文件中提取的字符串被正确读取,但这里的类型不匹配。

{
"Sender": {
"Email": "xxx@xxx.com",
"Password": "pwd",
"Server": "xxxxxx",
"ServerProtocol": "ServerProtocol.ExchangeEWS",
"ServerPort": 993,
"Ssl": true
},
"To" : ["myMail@test.com", ""],
"Cc" : "",
"Bcc" : "",
"Content": {
"EmailObject": "Email test",
"Message": "Hello World",
}
}

这里Cc属性是一个空字符串,而不是一个List of string。我希望这里有一个例外。我解决这个问题的方法是:

try
{
Console.WriteLine(emailStructure.Cc.Count == 0);
}
catch (Exception e)
{
throw new Exception("Oops something went wrong");
}

有没有更优雅的方法?我为那个解决办法感到羞耻……

Json数据在Cc字段中包含一个空对象。这将导致反序列化列表为空。

如果您希望反序列化在这种情况下抛出异常,则更改Cc属性的JsonProperty属性,这是必需的,但允许为null。

[JsonProperty(PropertyName = "Cc", Required = Required.AllowNull)]
public List<string> Cc { get; set; }

这将使反序列化抛出异常。Json数据必须包含一个带有列表的Cc。该列表仍然可以为空,但将被反序列化为列表。

例如,这将正确反序列化为Cc属性中的空列表:

{
"Sender": {
"Email": "xxx@xxx.com",
"Password": "pwd",
"Server": "xxxxxx",
"ServerProtocol": "ServerProtocol.ExchangeEWS",
"ServerPort": 993,
"Ssl": true
},
"To" : ["myMail@test.com", ""],
"Cc" : [],
"Bcc" : "",
"Content": {
"EmailObject": "Email test",
"Message": "Hello World",
}
}

相关内容

  • 没有找到相关文章

最新更新