在C#中使用动态类型并从JSON中访问元素数组(动态类型和DynamicJsonObject)

dly7yett  于 2022-12-15  发布在  C#
关注(0)|答案(1)|浏览(114)

我有一个取自第三方API的JSON字符串。但是,我们不知道该第三方API的确切JSON定义,它有很多属性,我们只知道他们有我们需要的信息
下面是一个示例

{
  "exp": 1670979934,
  "iat": 1670979634,
  "auth_time": 1670979634,
  "jti": "86a4610c-9e9a-473f-9cc0-0959aa779702",
  "iss": "http://localhost:8080/auth/realms/ScopicSoftware",
  "aud": "account",
  "sub": "2874bbca-e34b-44f0-8ca7-cfc57708a124",
  "typ": "Bearer",
  "azp": "keycloakdemo",
  "realm_access": {
    "roles": [
      "default-roles-scopicsoftware",
      "offline_access",
      "uma_authorization"
    ]
  },
  "resource_access": {
    "keycloakdemo": {
      "roles": [
        "admin"
      ]
    },
    "account": {
      "roles": [
        "manage-account",
        "manage-account-links",
        "view-profile"
      ]
    }
  }
...
...
}

正如我所说的,除了输出之外,我们不拥有JSON的确切信息,所以我们不能只执行Json.Deserialize并将模型对象传递给它。(或者我们可以基于有限的信息吗?)
我们希望访问“resource_access”-〉“keycloak_demo”和“roles”数组
我尝试使用C#中的动态类型

dynamic dataX = Json.Decode(responseString);

我可以通过

var demo = dataX.resource_access.keycloakdemo;

它返回一个DynamicJsonArray类型的变量,但是,我不能使用普通的for循环或Enumerator迭代它,它崩溃了。
那么,如果我们没有模型定义,那么正确的方法是什么呢?

zc0qhyus

zc0qhyus1#

你可以用这样的代码

var jsonParsed = JObject.Parse(json);

string[] roles = jsonParsed.SelectToken("resource_access.keycloakdemo.roles")
                                                          .ToObject<string[]>();

foreach (string role in roles)
{

}

相关问题