【问题标题】:Deserializing JSON with dynamic keys into certain type将带有动态键的 JSON 反序列化为特定类型
【发布时间】:2018-02-05 09:40:14
【问题描述】:

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

【问题讨论】:

  • 你在 rawJSON 中获得价值了吗?

标签: c# json json-deserialization


【解决方案1】:

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

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

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

var jo = JObject.Parse(jsonString);

这似乎可以反序列化。然后我可以通过以下方式访问属性

jo["CurrentVersion"].ToString()

jo["TaskObject"].ToString()

希望有帮助

【讨论】:

  • 谢谢,但我意识到我收到了一个 JSON 数组,所以我编辑了我的问题并找到了答案
【解决方案2】:

如果您将 lib.objects.task 声明为对象,它将起作用。 在你的情况下可能就足够了

【讨论】:

    【解决方案3】:

    我找到了解决办法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多