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

时间:2018-02-05 09:40:14

标签: c# json json-deserialization

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

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

以下是JSON的简短示例:

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

我的班级

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 数组,所以我编辑了我的例子。

3 个答案:

答案 0 :(得分:0)

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

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

我已经“逃脱”了我的例子中的反斜杠。

var jo = JObject.Parse(jsonString);

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

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

jo["TaskObject"].ToString()

希望有所帮助

答案 1 :(得分:0)

如果您将lib.objects.task声明为对象,它将起作用。 也许这在你的情况下已经足够了

答案 2 :(得分:0)

我找到了解决方案:

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