繁体   English   中英

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

[英]Deserializing JSON with dynamic keys into certain type

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

历史记录是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 数组 ,所以我已经编辑了示例。

或者,您可以使用JObject访问此对象

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

在我的示例中,我已经“转义”了反斜线。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM