我正在Xamarin中开发一个应用程序,我有一个非常简单的JSON文件,该文件由一些对象组成,这些对象我想一次反序列化到我在域中拥有的C#类中。(我正在使用Newtonsoft Json.NET Framework)
每个JSON对象具有3个属性:Title,Default和Custom。标题是一个简单的字符串,而自定义和默认是对的列表。
{
"messages": [
{
"Title": "...",
"Default": {
"lang1": "...",
"lang2": "..."
},
"Custom": {
"lang1": "",
"lang2": ""
}
},
{
"Title": "...",
"Default": {
"lang1": "...",
"lang2": "..."
},
"Custom": {
"lang1": "",
"lang2": ""
}
}
]
}
C#类仅包含相同的三个属性:
[JsonObject(MemberSerialization.OptIn)]
public class MessageItem
{
[JsonProperty]
public String Title { get; set; }
[JsonConverter(typeof (JsonDictionaryAttribute))]
public Dictionary<string, string> Default { get; set; }
[JsonConverter(typeof(JsonDictionaryAttribute))]
public Dictionary<string, string> Custom { get; set; }
}
现在,您可以看到,我已经尝试专门定义JsonConverter用于反序列化两个Dictionary属性的类。问题是,当我尝试反序列化包含单个“消息”对象的JToken时,得到了System.InvalidCastException。
我试图通过调用两者来反序列化
JsonConvert.DeserializeObject<Domain.MessageItem>(messageToken.ToString());
和
messageToken.ToObject<Domain.MessageItem>();
而且我显然得到了相同的结果。
但是,通过反序列化单个令牌,它可以正常工作,因此,我很确定我在做错的事情是我在类中使用的标志声明中的某些事情。
我希望你们中的一些人可以帮助我!提前致谢。
您可以反序列化为字典
Dictionary<string, List<MessageItem>> messageItems = JsonConvert.DeserializeObject<Dictionary<string, List<MessageItem>>>(yourJson);
foreach(MessageItem item in messageItems["messages"])
{
Console.WriteLine(item.Title);
}
或者,您可以编写一个包装器类:
[JsonObject(MemberSerialization.OptIn)]
public class MessageItems
{
[JsonProperty("messages")]
public List<MessageItem> Messages { get; set; }
}
并反序列化
MessageItems messageItems = JsonConvert.DeserializeObject<MessageItems>(yourJson);
foreach(MessageItem item in messageItems.Messages)
{
Console.WriteLine(item.Title);
}
为了使这些示例生效,我必须从您的MessageItem类中删除[JsonConverter(typeof(JsonDictionaryAttribute))]属性,并替换为[JsonProperty]。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句