[英]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.