簡體   English   中英

將 JSON 反序列化為字典<string, List<string> &gt;

[英]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 也為您提供了這樣的功能。

上課絕對是一個很好的方法,我同意克里斯托斯的觀點。

但是,如果您正在做一次性的事情並且不想打擾制作課程,您可以通過將整個事情反序列化為動態然后將您需要的部分重新序列化和反序列化為您期望的類型來破解它,就像這樣.

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM