我有一个使用Json.NET v7.0.1的C#应用程序。作为REST调用的结果,我以以下形式获得了一些JSON:
{
"messages": [ {"phoneNumber":"123-456-7890", "smsText":"abcd1234="},
{"phoneNumber":"234-567-8901", "smsText":"efgh5678="},
{"phoneNumber":"345-678-9012", "smsText":"12345asdf"} ]
}
如果没有要返回的消息数据,我得到的JSON看起来像这样:
{
"messages": [ ]
}
我的Message类看起来像这样:
public class Message
{
public string PhoneNumber { get; set; }
public string SmsText { get; set; }
public Message()
{
}
public Message(string phoneNumber, string smsText)
{
PhoneNumber = phoneNumber;
SmsText = smsText;
}
}
当我尝试反序列化JSON时,我使用以下代码:
Message[] messages = JsonConvert.DeserializeObject<Message[]>(json, new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Ignore
});
我遇到的问题是在messages数组为空时反序列化JSON。发生这种情况时,我得到以下异常:
无法反序列化当前的JSON对象(例如{\&#34; name \&#34;:\&#34; value \&#34;}) 进入类型&#39; WindowsFormTestApplication.Message []&#39;因为类型 需要一个JSON数组(例如[1,2,3])才能正确反序列化。\ r \ nTo 修复此错误要么将JSON更改为JSON数组(例如[1,2,3]) 或更改反序列化类型,使其成为正常的.NET类型(例如 不是像整数这样的原始类型,不是像数组那样的集合类型 或者List)可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到类型中以强制它 从JSON对象反序列化。 路径&#39;消息&#39;,第2行,第15位。
当JSON数组为空时,我希望我的Message []变量为null。我需要一个自定义转换器来进行反序列化吗?或者我错过了一些明显的东西?谢谢!
答案 0 :(得分:4)
您应该只发送一个数组
[ {"phoneNumber":"123-456-7890", "smsText":"abcd1234="},
{"phoneNumber":"234-567-8901", "smsText":"efgh5678="},
{"phoneNumber":"345-678-9012", "smsText":"12345asdf"} ]
或者使用像这样的包装器对象
public WrapperObject
{
public Message[] messages { get; set; }
}
然后使用它反序列化
var wrapper = JsonConvert.DeserializeObject<WrapperObject>(json, new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Ignore
});
答案 1 :(得分:2)
创建一个包装类并将Json反序列化为它:
public class MessageArray
{
public Message[] Messages;
}
var messages = JsonConvert.DeserializeObject<MessageArray>(json, new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Ignore
});