首页 > 解决方案 > 将 JSON 反序列化为包含两个 Dictionary 属性的 C# 类

问题描述

我正在 Xamarin 中开发一个应用程序,我有一个非常简单的 JSON 文件,它由我想一次性反序列化到我在我的域中的 C# 类中的对象组成。(我正在使用Newtonsoft Json.NET框架)

每个 JSON 对象都有 3 个属性:Title、Default 和 Custom。Title 是一个简单的字符串,而 Custom 和 Default 是一对列表。

{  
  "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>();

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

但是,通过反序列化单个令牌,它工作得很好,所以我很确定我做错了什么是我在课堂上使用的标志声明中的东西。

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

标签: c#.netjsonxamarin

解决方案


你有一个正确的类设置MessageItem,但是你发布的 JSON 是一个List<MessageItem>.

创建以下类:

public class MessageList {
    [JsonProperty]
    public List<MessageItem> messages { get; set; }
}

并使用Newtonsoft.Json.JsonConvert.DeserializeObject<MessageList>(messageToken.ToString()),这应该可以解决问题。


推荐阅读