簡體   English   中英

C#在不知道它們的情況下獲取JSON名稱

[英]C# getting json name without knowing them

我有這個傑森:

{
  "objects": {
    "realms/lang/de_DE.lang": {
      "hash": "729b2c09d5c588787b23127eeda2730f9c039194",
      "size": 7784
    },
    "realms/lang/cy_GB.lang": {
      "hash": "7b52463b2df4685d2d82c5d257fd5ec79843d618",
      "size": 7688
    },
    "minecraft/sounds/mob/chicken/step2.ogg": {
      "hash": "bf7fadaf64945f6b31c803d086ac6a652aabef9b",
      "size": 3838
    },
    "minecraft/sounds/dig/gravel3.ogg": {
      "hash": "48f7e1bb098abd36b9760cca27b9d4391a23de26",
      "size": 6905
    },
    "minecraft/lang/uk_UA.lang": {
      "hash": "02ca127554fb1294b473bac256469a0d908ecd86",
      "size": 97299
    },
    "minecraft/sounds/mob/cat/hitt3.ogg": {
      "hash": "3d98b4b7c37a09101da00d8a3078e0acba6558f4",
      "size": 7371
    },
    "minecraft/sounds/mob/horse/zombie/hit3.ogg": {
      "hash": "ad126e435cca94054bf0d616301799a105526cde",
      "size": 7043
    },
    "minecraft/sounds/mob/endermen/portal.ogg": {
      "hash": "7b4b5323ef066caa1ae43cbe66fffd9dfce4ed32",
      "size": 10010
    },
    "minecraft/sounds/random/glass2.ogg": {
      "hash": "87c47bda3645c68f18a49e83cbf06e5302d087ff",
      "size": 7532
    },
    "minecraft/sounds/mob/bat/hurt1.ogg": {
      "hash": "fddba78b2426f8056be081c98fe82e8411a0a5cf",
      "size": 4878
    },
    "minecraft/sounds/ambient/cave/cave9.ogg": {
      "hash": "b463fa47816fe9a5dfe508093150e647403e4db6",
      "size": 27096
    },
    "minecraft/sounds/records/13.ogg": {
      "hash": "9cbed0e40296f68c61090c9b81816061e068a0ec",
      "size": 1071028
    },
    "minecraft/sounds/mob/enderdragon/wings1.ogg": {
      "hash": "5a368ed32b3357e31629451ace57eb30d90e8874",
      "size": 10617
    },
    "minecraft/lang/ast_ES.lang": {
      "hash": "fc2139572f55c973aedc694b8d633f2a4eb0907a",
      "size": 72927
    },
    "realms/lang/ast_ES.lang": {
      "hash": "3f0a1aea8af9451493927ecb8a18997881ad0e2f",
      "size": 7608
    },
    "minecraft/sounds/mob/cow/step3.ogg": {
      "hash": "482919bc631b317422ab44af3938259bea73fe83",
      "size": 7923
    },
    "minecraft/sounds/step/cloth3.ogg": {
      "hash": "9c63f2a3681832dc32d206f6830360bfe94b5bfc",
      "size": 4897
    },
    "minecraft/sounds/mob/endermen/hit2.ogg": {
      "hash": "cf60aefd0b742c3fa15e808c1a0c33aebd534cc5",
      "size": 6491
    },
    "minecraft/sounds/random/eat3.ogg": {
      "hash": "9f2c4bab5ed55f1714fffa223985c81babc8f6c0",
      "size": 5813
    },
    "minecraft/sounds/step/sand5.ogg": {
      "hash": "9fd6d2c633d276b952f2ff2aaa1fa7e5fb5efd2a",
      "size": 5182
    },
    "minecraft/sounds/step/ladder5.ogg": {
      "hash": "e9a1caaddcde79cdac7aa8eabde50d4cfd1bc578",
      "size": 6077
    },
    "minecraft/sounds/music/game/nuance1.ogg": {
      "hash": "cc1a80b6becfc6d6489c069f053d0a8adc71c339",
      "size": 156322
    },
    "minecraft/lang/zh_TW.lang": {
      "hash": "d2f3c9c340a5cfe30fb7e333c81a4d853d9bbddd",
      "size": 68697
    },
    "minecraft/sounds/random/eat1.ogg": {
      "hash": "dfee39084c771182f6b9e7cfb8c8bc4e255747bc",
      "size": 5678
    },
    "minecraft/icons/minecraft.icns": {
      "hash": "991b421dfd401f115241601b2b373140a8d78572",
      "size": 114786
    },
    "minecraft/lang/es_AR.lang": {
      "hash": "e55edae0011215873faeba154c7d89f590ddb748",
      "size": 74392
    },
    "minecraft/sounds/mob/blaze/breathe4.ogg": {
      "hash": "78d544a240d627005aaef6033fd646eafc66fe7a",
      "size": 22054
    },
    "minecraft/sounds/dig/sand4.ogg": {
      "hash": "37afa06f97d58767a1cd1382386db878be1532dd",
      "size": 5491
    }
  }
}

這是我的代碼:

    List<string> namesList = new List<string>();
    dynamic json1 = JsonConvert.DeserializeObject(data);

現在我被困住了……我有兩個問題:我必須讀取對象內部的每個名稱,例如

realms/lang/de_DE.lang

問題是我不知道名稱,在互聯網上我只是找到了如何讀取動態json對象內的值,而不是如何讀取其名稱...

第二個問題是,在另一個類上,我必須處理所有這些數據,並且我也需要散列。 是否方便地計算每個文件(有675個文件)的當前哈希值或將哈希值作為返回值傳遞? 我已經返回了一個轉換為URL數組的列表,所以我不知道如何同時返回URL和HASH,然后對其進行處理。 我使用foreach循環將值添加到名稱列表:

namesList.Add(finalurl);

然后我返回這個:

return namesList.ToArray();

您應該這樣創建反序列化的類:

public class MyClass
{
    [JsonProperty("objects")]
    public IDictionary<string, ObjectValue> Objects { get; set; }
}

public class ObjectValue
{
    [JsonProperty("hash")]
    public string Hash { get; set; }

    [JsonProperty("size")]
    public long Size { get; set; }
}

然后您可以得到這樣的名字:

MyClass json = JsonConvert.DeserializeObject<MyClass>(data);
var names = json.Objects.Keys.ToList();
var hash = json.Objects[names[0]].Hash; // Get the hash of the first item

同樣不要忘記檢查是否為null和其他可能的錯誤(無數據等)。

LB提供了一個很好的答案。

json數據看起來與user3468962中的這個問題匹配。 可接受的答案已發布在VB中,但是可以提供有用的基礎。

返回類型化的對象也很有用。 根據我的經驗,我一直在盡量避免使用動態屬性,因為動態屬性的類型不安全,並且可能導致遺留支持問題。

嘗試...

Foo json = JsonConvert.DeserializeObject<Foo>(data);

...

public class Foo
{
  public string Hash { get; set; }
  public long Size { get; set; }
}

暫無
暫無

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

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