获取特定值的JToken

5

我有以下的JToken输出。我该如何从TenantID中检索出'value',在这种情况下应该是1?

{[
 {
  "value": 1,
  "metadata": {
   "userType": 0,
   "flags": 8,
   "type": {
    "type": "INT4",
    "name": "Int",
    "id": 56
   },
   "colName": "TenantID"
  }
 }
]}

这是我目前的代码:
        JToken value;
        if (usr.Profile.TryGetValue("tenantid", out value))
        {
            JObject inner = value["value"].Value<JObject>(); //not working with null error
            User.TenantID = (string)value;
        }
        User.obj = usr.Profile;

编辑 - 请在下面找到完整的JToken输出:

    {[
    {
    "value": 1,
    "metadata": {
      "userType": 0,
      "flags": 8,
      "type": {
        "type": "INT4",
        "name": "Int",
        "id": 56
      },
      "colName": "TenantID"
    }
    }
    ]}
    Count: 1
    First (Newtonsoft.Json.Linq.JContainer): {{
  "value": 1,
  "metadata": {
    "userType": 0,
    "flags": 8,
    "type": {
      "type": "INT4",
      "name": "Int",
      "id": 56
    },
    "colName": "TenantID"
  }
}}
    First (Newtonsoft.Json.Linq.JToken): {{
  "value": 1,
  "metadata": {
    "userType": 0,
    "flags": 8,
    "type": {
      "type": "INT4",
      "name": "Int",
      "id": 56
    },
    "colName": "TenantID"
  }
}}
    HasValues: true
    IsReadOnly: false
    Last (Newtonsoft.Json.Linq.JContainer): {{
`"value": 1,
  "metadata": {
    "userType": 0,
    "flags": 8,
    "type": {
      "type": "INT4",
      "name": "Int",
      "id": 56
    },
    "colName": "TenantID"
  }
}}
    Last (Newtonsoft.Json.Linq.JToken): {{
  "value": 1,
  "metadata": {
    "userType": 0,
    "flags": 8,
    "type": {
      "type": "INT4",
      "name": "Int",
      "id": 56
    },
    "colName": "TenantID"
  }
}}
    Next: (null)
    Parent: {"tenantid": [
  {
    "value": 1,
    "metadata": {
      "userType": 0,
      "flags": 8,
      "type": {
        "type": "INT4",
        "name": "Int",
        "id": 56
      },
      "colName": "TenantID"
    }
  }
]}
    Path: "tenantid"
    Previous: (null)
    Static members: 
    Non-public members: 
    IEnumerator: 
    Root: {{
  "name": "Rx Sidhu",
  "given_name": "Rx",
  "family_name": "Sidhu",
  "locale": "en_US",
  "emails": [
    "ranxdeep@xxx.com",
    "ranxdeep@xxx.com",
    "ranxdeep@hx.com"
  ],
  "nickname": "ranxdeep@xxx.com",
  "email": "ranxdeep@xxx.com",
  "picture": "https://apis.live.net/v5.0/f1xxxxxx/picture",
  "roles": [
    "Account Admin",
    "Admin"
  ],
  "tenantid": [
    {
      "value": 1,
      "metadata": {
        "userType": 0,
        "flags": 8,
        "type": {
          "type": "INT4",
          "name": "Int",
          "id": 56
        },
        "colName": "TenantID"
      }
    }
  ],
  "email_verified": true,
  "clientID": "wxxxvC8",
  "updated_at": "2015-07-15T16:26:30.526Z",
  "user_id": "windowslive|f1axxxac",
  "identities": [
    {
      "access_token": "EwBwAq1",
      "provider": "windowslive",
      "user_id": "f1aexxxxxac",
      "connection": "windowslive",
      "isSocial": true
    }
  ],
  "created_at": "2015-07-01T06:08:21.358Z"
}}
    Type: 2

我需要检查租户ID是否存在,如果存在则获取该值,否则返回null或0。


这个 JToken 是不正确的。JObject 只能包含 JProperty,不能直接包含 JArray。请检查。 - Ghasan غسان
@Ghasan,我已添加完整的输出结果,请查看。 - Randeep Singh
3个回答

6

您应该能够做到以下事情:

JObject jObject = JObject.Parse(...);
JToken value = jObject.SelectToken("value");

你需要解析你的object,然后暴露其中的内容,你可以利用SelectToken方法查找特定的值。
为了进一步构建它,你可能需要执行以下步骤:
public static JToken FindToken<T>(string key, T value)
{
     string serialized = NewtonsoftJsonSerializer.Instance.Serialize(value);
     var jObject = JObject.Parse(serialized);
     var jToken = jObject.SelectToken(key);

     if(jToken != null)
          return jToken;

     return null;
}

我无法解析这里的 Json。 JObject jObject = JObject.Parse(usr.Profile ["tenantid"].ToString ()); - Randeep Singh

0

虽然我还不能完全理解你的JSON,但是看一下这个可能会对你有帮助。

var str = @"{
    ""x"": [{
            ""value"": 1,
            ""metadata"": {
                ""userType"": 0,
                ""flags"": 8,
                ""type"": {
                    ""type"":""INT4"",
                    ""name"":""Int"",
                    ""id"": 56
                },
                ""colName"":""TenantID""
            }
        }
    ]
}";

var parentJObject = JObject.Parse(str);
var xJArray = (JArray)parentJObject["x"];

// first item in JArray which is the object of interest
// look for the appropriate index of the JObject of your data
var firstJTokenInxJArray = (JObject)xJArray[0];

Console.WriteLine(firstJTokenInxJArray["value"].ToString());

0

我找到了我想要的:

JToken value;
        if (usr.Profile.TryGetValue("tenantid", out value))
        {
            User.TenantID = (int)value [0] ["value"];
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接