使用动态键将 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()));
我想在 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()));