将JSON反序列化为字典 >

问题描述 投票:2回答:2

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

c# json json-deserialization
2个回答
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也会为您提供这种功能。


0
投票

上课绝对是上课的好方法,我同意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);
© www.soinside.com 2019 - 2024. All rights reserved.