使用动态键将 JSON 反序列化为特定类型

Deserializing JSON with dynamic keys into certain type

我想在 Newtonsoft.Json 的帮助下将 JSON 字符串反序列化为 Version 对象。

History 是 int 键和 TaskObject 值的字典。密钥是一个动态数字。

这是 JSON 的一个简短示例:

[
   {
     "CurrentVersion": 3,
     "TaskObject": {},
     "History": {
       "1": {},
       "2": {}
     },
     "ObjectTypeName": "the type"
   }
]

我的Class

public class Version : Lib.Objects.Task
    {
        public int CurrentVersion { get; set; }
        public Lib.Objects.Task TaskObject { get; set; }
        public Dictionary<int, Lib.Objects.Task> History { get; set;} 
        public string ObjectTypeName { get; set; }                          
    }

代码

string rawJSON;
using (var wc = new WebClient())
    rawJSON = wc.DownloadString(uri);
var version = JsonConvert.DeserializeObject<Objects.Version>(rawJSON); //throws a JsonSerializationException

但是我得到一个例外

Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type

知道如何解决这个问题,以便我可以将 JSON 反序列化为 Version 对象吗?

编辑

结果我收到了一个 JSON 数组 ,所以我编辑了我的示例。

作为替代方案,您可以使用 JObject

var jsonString = "{\"CurrentVersion\": 3,\"TaskObject\": { },\"History\": {\"1\": { },\"2\": { }},\"ObjectTypeName\": \"the type\"}";

我的示例中有 "escaped" 反斜杠。

var jo = JObject.Parse(jsonString);

这似乎可以反序列化。然后我可以通过下面的

访问属性
jo["CurrentVersion"].ToString()

jo["TaskObject"].ToString()

希望对您有所帮助

如果您将 lib.objects.task 声明为对象,它将起作用。 也许对你来说就足够了

我找到了解决方案:

string rawJSON;
using (var wc = new WebClient())
    rawJSON = wc.DownloadString(uri);

var versions = new List<Objects.Version>();
foreach (var jToken in JArray.Parse(rawJSON))
    versions.Add(JsonConvert.DeserializeObject<Objects.Version>(jToken.ToString()));