我是JSON的新手,所以我可能错过了一些东西。 但是,这就是我正在尝试的。 我想反序列化以下类型的JSON

{   "Size":    {     "Creature":      {       "Dragon":        [         "Huge",         "Colossal",         "Mountain-sized"       ],        "Wolf":        [         "Pup",         "Fully grown",         "Giant"       ]     },      "Building":      [       "Small",       "Medium",       "Large"     ]   } }  

JSON的核心功能旨在防止我随时间推移嵌套的方式。 对于具有根据其生物种类而定的亚型的生物,对于建筑物等也具有相同的亚型。

我尝试使用此代码

using StreamReader r = new StreamReader("Storage.json"); string json = r.ReadToEnd(); CoreStorageDict = JsonConvert.DeserializeObject<Dictionary<string, List<string>>>(json); 

我想尽可能直接将其反序列化为字典,但是我还没有找到一种好的方法来完成它,而且我想我缺少整个系统的基本知识。

JSON错误还是我的代码错误? 还是两者都有?

===============>>#1 票数:4 已采纳

如果定义以下类:

public class Creature {     public IList<string> Dragon { get; set; }     public IList<string> Wolf { get; set; } }  public class Size {     public Creature Creature { get; set; }     public IList<string> Building { get; set; } }  public class Example {     public Size Size { get; set; } } 

然后尝试反序列化您的json即可。 您可以根据需要更改类的名称。 对于上述名称,您只需执行以下操作:

var result = JsonConvert.DeserializeObject<Example>(json); 

您采用的方法有什么问题?

问题是您有嵌套的类型。 因此,您必须正确声明每个类型,才能进行反序列化工作。

如何找到需要声明的类?

可能有一些工具可以完成这项工作。 我使用的是以下一个JSON Utils 只要您具有有效的json,这些工具就可以自动生成所需的类。 如果我是正确的话,Visual Studio也会为您提供这种功能。

  ask by Tor Nordmark translate from so

===============>>#2 票数:1

上课绝对是上课的好方法,我同意Christos的观点。

但是,如果您要做的是一次性的事情,并且不想打扰类,则可以通过将整个过程反序列化为动态,然后重新序列化和反序列化所需的部分,以达到预期的类型,从而进行破解。

   var json = @"{                     ""Size"": {                       ""Creature"": {                         ""Dragon"": [                           ""Huge"",                           ""Colossal"",                           ""Mountain-sized""                         ],                         ""Wolf"": [                           ""Pup"",                           ""Fully grown"",                           ""Giant""                         ]                       },                       ""Building"": [                         ""Small"",                         ""Medium"",                         ""Large""                       ]                     }                   }";              var deserialized = JsonConvert.DeserializeObject<dynamic>(json);              var thePartYouWant = deserialized.Size.Creature;              var dict = (Dictionary<string, List<string>>) JsonConvert                 .DeserializeObject<Dictionary<string, List<string>>>(                     (JsonConvert.SerializeObject(thePartYouWant)));              dict.Keys.ToList().ForEach(Console.WriteLine); 

  ask by Tor Nordmark translate from so

本文未有回复,本站智能推荐: