如何获得JSON对象的名称使用?(c# Newtonsoft.JSON)

本文关键字:JSON Newtonsoft 对象 何获得 | 更新日期: 2023-09-27 18:08:50

对于那些熟悉Minecraft的人来说,1.8更新将声音存储为一个以加密散列作为名称的文件(您可以将扩展名更改为。ogg来播放)。在assets文件夹中有一个以JSON文件形式存储的索引,该索引显示每个文件的正确发音,并带有加密的散列名称。

我正在尝试创建一个程序,用户键入名称,它将找到包含该名称的声音。索引以这种方式存储:

{ "objects":{"minecraft/sounds/mob/wither/idle2.ogg": {
  "hash": "6b2f86a35a3cd88320b55c029d77659915f83239",
  "size": 19332
},
"minecraft/lang/fil_PH.lang": {
  "hash": "e2c8f26c91005a795c08344d601b10c84936e89d",
  "size": 74035
},
"minecraft/sounds/note/snare.ogg": {
  "hash": "6967f0af60f480e81d32f1f8e5f88ccafec3a40c",
  "size": 3969
},
"minecraft/sounds/mob/villager/idle1.ogg": {
  "hash": "a772db3c8ac37dfeb3a761854fb96297257930ab",
  "size": 8605
},
"minecraft/sounds/mob/wither/hurt3.ogg": {
  "hash": "a4cf4ebe4c475cd6a4852d6b4228a4b64cf5cb00",
  "size": 16731
}

例如,如果用户输入wither,它将获取"minecraft/sounds/mob/wither/idle2.ogg"的哈希值。和"minecraft/声音/暴徒/枯萎/hurt3.ogg"

我的问题是,我如何获得对象名称(名称,而不是属性)来与用户的关键字字符串进行比较。

对不起,如果我没有使用适当的术语对某些词,我不修补JSON文件太多。根据需要纠正我的术语

如何获得JSON对象的名称使用?(c# Newtonsoft.JSON)

编辑

这个答案很好地解决了这个问题(没有动态):

https://stackoverflow.com/a/32129497/563532

原始答:

如此:

var obj = JsonConvert.DeserializeObject<dynamic>(@"{ ""objects"":{""minecraft/sounds/mob/wither/idle2.ogg"": {
  ""hash"": ""6b2f86a35a3cd88320b55c029d77659915f83239"",
  ""size"": 19332
},
""minecraft/lang/fil_PH.lang"": {
  ""hash"": ""e2c8f26c91005a795c08344d601b10c84936e89d"",
  ""size"": 74035
},
""minecraft/sounds/note/snare.ogg"": {
  ""hash"": ""6967f0af60f480e81d32f1f8e5f88ccafec3a40c"",
  ""size"": 3969
},
""minecraft/sounds/mob/villager/idle1.ogg"": {
  ""hash"": ""a772db3c8ac37dfeb3a761854fb96297257930ab"",
  ""size"": 8605
},
""minecraft/sounds/mob/wither/hurt3.ogg"": {
  ""hash"": ""a4cf4ebe4c475cd6a4852d6b4228a4b64cf5cb00"",
  ""size"": 16731
}
}
}");
var t = obj.objects;
var names = new HashSet<String>();
foreach(JProperty fileThing in t)
{
    names.Add(fileThing.Name);
}
names.Dump();

给:

minecraft/声音/暴徒/枯萎idle2.ogg
minecraft/lang/fil_PH.lang
minecraft/声音/注意/snare.ogg
minecraft/声音/暴徒/村民/idle1.ogg
minecraft/声音/暴徒//hurt3掉落。ogg

你也可以这样做:

var t = obj.objects;
var names = new Dictionary<String, String>();
foreach(JProperty fileThing in t)
{
    names.Add(fileThing.Name, (string)t[fileThing.Name].hash);
}

给你一个字典,将原始名称链接到哈希:

minecraft/声音/暴徒//idle2掉落。Ogg -> 6b2f86a35a3cd88320b55c029d77659915f83239minecraft/lang/fil_PH。Lang -> e2c8f26c91005a795c08344d601b10c84936e89dminecraft/声音/注意/陷阱。Ogg -> 6967f0af60f480e81d32f1f8e5f88ccafec3a40cminecraft/声音/暴徒/村民/idle1。Ogg -> a772db3c8ac37dfeb3a761854fb96297257930abminecraft/声音/暴徒//hurt3掉落。Ogg -> a4cf4ebe4c475cd6a4852d6b4228a4b64cf5cb00

假设您有一个jsonString作为字符串变量

jsonString = ";

JArray array = JArray.Parse(json);
foreach (JObject content in array.Children<JObject>())
{
    foreach (JProperty prop in content.Properties())
    {
        Console.WriteLine(prop.Name);
    }
}