反序列化 JSON 到字典 <string, List<string>>

Deserialize JSON to Dictionary<string, List<string>>

我是 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错了还是我的代码错了?或者两者都有?

如果定义如下类:

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,为您提供了这样的功能。

制作 类 绝对是一个很好的方法,我同意 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);