在 C# 中解析动态 JSON

Parsing Dynamic JSON in C#

我正在使用使用 GraphQL 和 returns JSON 数据的 API,我想动态反序列化 JSON 内容而不是映射整个服务结构在我的应用程序中放入 C# 数据结构 (.NET types/classes)。

我以前做过,但是 JSON 数据非常简单明了。但是,this API 我正在使用 returns more complex/verbose JSON 并且我正在努力正确解析它。

任何人都可以建议如何解析下面的 JSON?即如何访问动态JSON的objects/properties.

我正在使用 Newtonsoft.Json。这是我要反序列化的代码:

byte bC = 0;
string location_text = string.Empty;
string location_value = string.Empty;
dynamic results = JsonConvert.DeserializeObject<dynamic>(json);
foreach (dynamic d in results)
{
   bC = d.data.locationSuggestions.Count; // d.locationSuggestions.Count
   for (byte b = 0; b < bC; b++)
   {
       location_text = d.data.locationSuggestions[b].location.contextualName;
       location_value = d.data.locationSuggestions[b].location.id.value;
   }
}

当我 运行 此代码时,我收到一条错误消息,提示找不到“数据”或“locationSuggestions”。

我要解析的JSON如下:

{
  "data": {
    "locationSuggestions": [
      {
        "location": {
          "id": {
            "value": "seekAnzPublicTest:location:seek:2dkY4vZJF"
          },
          "name": "Brisbane",
          "contextualName": "Brisbane QLD 4000 AU",
          "countryCode": "AU",
          "parent": {
            "id": {
              "value": "seekAnzPublicTest:location:seek:2FjxhQans"
            },
            "name": "CBD & Inner Suburbs",
            "parent": {
              "id": {
                "value": "seekAnzPublicTest:location:seek:32XZdsa2K"
              },
              "name": "Brisbane"
            }
          }
        }
      },
      {
        "location": {
          "id": {
            "value": "seekAnzPublicTest:location:seek:2ckmimaF1"
          },
          "name": "Brisbane Grove",
          "contextualName": "Brisbane Grove NSW 2580 AU",
          "countryCode": "AU",
          "parent": {
            "id": {
              "value": "seekAnzPublicTest:location:seek:2UC23LszP"
            },
            "name": "Southern Highlands & Tablelands",
            "parent": {
              "id": {
                "value": "seekAnzPublicTest:location:seek:FTwZdE2K"
              },
              "name": "New South Wales"
            }
          }
        }
      }
    ]
  },
  "extensions": {
    "requestLatency": 171
  }
}

关于您的 JSON 字符串,您可以使用 dynamic 来解析它并访问数据,如下所示:

您还可以在以下网址找到工作示例:https://dotnetfiddle.net/lnhwJz

using System;
using Newtonsoft.Json;

                    
public class Program
{
    public static void Main()
    {
        var jsonString=@"{'data':{'locationSuggestions':[{'location':{'id':{'value':'seekAnzPublicTest:location:seek:2dkY4vZJF'},'name':'Brisbane','contextualName':'Brisbane QLD 4000 AU','countryCode':'AU','parent':{'id':{'value':'seekAnzPublicTest:location:seek:2FjxhQans'},'name':'CBD & Inner Suburbs','parent':{'id':{'value':'seekAnzPublicTest:location:seek:32XZdsa2K'},'name':'Brisbane'}}}},{'location':{'id':{'value':'seekAnzPublicTest:location:seek:2ckmimaF1'},'name':'Brisbane Grove','contextualName':'Brisbane Grove NSW 2580 AU','countryCode':'AU','parent':{'id':{'value':'seekAnzPublicTest:location:seek:2UC23LszP'},'name':'Southern Highlands & Tablelands','parent':{'id':{'value':'seekAnzPublicTest:location:seek:FTwZdE2K'},'name':'New South Wales'}}}}]},'extensions':{'requestLatency':171}}";
        var parsedData=JsonConvert.DeserializeObject<dynamic>(jsonString);
        
        foreach(var item in parsedData.data.locationSuggestions)
        {
          Console.WriteLine(item.location.name);          
          Console.WriteLine(item.location.id.value);
          Console.WriteLine(item.location.contextualName);
        }
    }
}

输出:

Brisbane 
seekAnzPublicTest:location:seek:2dkY4vZJF 
Brisbane QLD 4000 AU 
Brisbane Grove 
seekAnzPublicTest:location:seek:2ckmimaF1 
Brisbane Grove NSW 2580 AU