在通过 NewtonSoft Linq 遍历该数组之前检索 JSON 对象数组的键/标识符

Retrieving key/identifier of array of JSON objects before iterating through that array via NewtonSoft Linq

提问人:Hazeron 提问时间:11/17/2023 更新时间:11/17/2023 访问量:57

问:

有没有一种方法可以在遍历该数组之前检索JSON对象数组的“键”?我正在尝试将每个数组中的值与关联的键相关联,但在使用 NewtonSoft 的 Linq 库解析它时,我无法确定是否使用 JArrays、JObjects 等。

{
    
    "DENSE_FOREST": [

        {
            "Terrain_Key": "FIELD_GRASS",
            "Name" : "Grassy Field"
        },

        {
            

        }
        
    ],

    "TEST" : [

    ]
}

例如,我希望能够获取名称/字符串“DENSE_FOREST”,遍历关联的数组,以便我可以从中提取数据并将其关联到我正在使用的数据结构中的“DENSE_FOREST”下,然后转到“TEST”,依此类推。

我正在尝试将其作为 JArray 进行迭代,但语法让我感到困惑,我在网上找到的示例并不完全适用于我的问题。

JSON LINQ的

评论


答:

1赞 Denis Micheal 11/17/2023 #1

有没有一种方法可以检索JSON对象数组的“键” 在遍历所述数组之前?

您提供的示例字符串是一个,因此您可以先像这样解析它:jsonJObject

string jsonData = @"{
            ""DENSE_FOREST"": [
                {
                    ""Terrain_Key"": ""FIELD_GRASS"",
                    ""Name"": ""Grassy Field""
                },
                {
                    ""Terrain_Key"": ""FOREST"",
                    ""Name"": ""Forest Area""
                }
            ],
            ""TEST"": []
        }";

JObject jsonObject = JObject.Parse(jsonData);

然后继续搜索 A with 键,将其转换为 A 并检索内容。JPropertyDENSE_FORESTjsonObjectJArray

 // Retrieve the specific key "DENSE_FOREST"
JArray denseForestArray = (JArray)jsonObject["DENSE_FOREST"];

 // Check if the key exists and is an array
if (denseForestArray != null && denseForestArray.Type == JTokenType.Array)
{
  // Process the items in "DENSE_FOREST" array
   foreach (JObject item in denseForestArray)
   {
      string terrainKey = item.Value<string>("Terrain_Key");
      string name = item.Value<string>("Name");

       Console.WriteLine("Terrain_Key: " + terrainKey + ", Name: " + name);
     }
}
else
{
  Console.WriteLine("Key 'DENSE_FOREST' does not exist or is not an array.");
}

您还可以测试小提琴

编辑

要遍历 中的所有项目,您可以这样做:JObject

foreach (var property in jsonObject)
{
    string key = property.Key;
    Console.WriteLine("Key: " + key);

    //cast JProperty value to JArray
    JArray jsonArray = (JArray)property.Value;
    foreach (JObject item in jsonArray)
    {
      string terrainKey = item.Value<string>("Terrain_Key");
      string name = item. Value<string>("Name");

      Console.WriteLine("Terrain_Key: " + terrainKey + ", Name: " + name);
    }
}

评论

0赞 Hazeron 11/17/2023
是否可以在不对特定键进行硬编码调用的情况下对其进行迭代?我想检索每个键的名称,然后遍历关联的数组。这将使用 JBobject 的 children 属性来完成,对吗?
0赞 Denis Micheal 11/17/2023
@Hazeron 是的,还添加了如何做到这一点。
0赞 Hazeron 11/17/2023
谢谢你,我感谢你的帮助!