将JSON反序列化为Dictionary <string,List <string >>

时间:2019-12-01 10:56:53

标签: c# json json-deserialization

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

2 个答案:

答案 0 :(得分: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也会为您提供这种功能。

答案 1 :(得分: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);