我希望在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 数组,所以我编辑了我的例子。
答案 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()));