将JSON反序列化为包含两个Dictionary属性的C#类

劳拉

我正在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>();

而且我显然得到了相同的结果。

但是,通过反序列化单个令牌,它可以正常工作,因此,我很确定我在做错的事情是我在类中使用的标志声明中的某些事情。

我希望你们中的一些人可以帮助我!提前致谢。

NitrusAphalion

您可以反序列化为字典

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章