使用newtonsoft json.net反序列化keystone json响应

时间:2013-10-21 20:55:40

标签: c# json json.net openstack keystone

我正在编写C#代码来访问Swift对象库。第一步是根据Keystone身份服务对用户进行身份验证。我已成功完成此操作并获得以下JSON字符串作为响应。

{
  "access":{
    "token":{
      "expires": "2013-10-22T17:09:46Z",
      "id": "c6f69256db4d45af819cc42b54e18f69",
      "tenant": {
        "enabled": true,
        "id": "7b9a902423a582c9eda266dcf3ad697420c1c3ff9429b1dfd255152f3bf2098f",
        "name": "tenant1"}
      },
    "serviceCatalog":[
      {
        "endpoints": 
        [
          {
            "adminURL": "http://mysite.com:8888/",
            "region": "RegionOne",
            "internalURL":"http://mysite.com:8888/v1/AUTH_7b9a902423a52d255152f3bf2098f",
            "id": "4ec67a5dcd034a68ad08a2fc133a8dc0",
            "publicURL": http://mysite.com:8888/v1/AUTH_7b9a902423a52d255152f3bf2098f
          }
        ],
        "endpoints_links": [],
        "type": "object-store",
        "name": "swift"}
    ],
    "user":{
      "username": "user1",
      “roles_links": [],
      "id": "324c2ae86fff69d22629320cdf589f417b9a902423a582c9eda266dcf3ad6974",
      "roles":[
        {"name": "tenant1"},
        {"name": "Likewise Users"},
        {"name": "tenant1"}
      ],
      "name": "user1"
    },
    "metadata":{
      "is_admin": 0,
      "roles":[
        "7b9a902423a582c9eda266dcf3ad697420c1c3ff9429b1dfd255152f3bf2098f",
        "7b9a902423a582c9eda266dcf3ad6974104ff417849b613ce82c28d1562f82c8",
        "7b9a902423a582c9eda266dcf3ad697420c1c3ff9429b1dfd255152f3bf2098f"
      ]
    }
  }
}

我有使用JSON.net 4.0.3的代码,它使用了一种相当粗略的方法(我的代码,而不是newtonsoft)将信息从JSON中提取出来并导入我可以用来引用属性的字典集合中需要。我的代码看起来像这样。

var accessRoot = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonResponse);
var accessItems = JsonConvert.DeserializeObject<Dictionary<string, object>>(accessRoot["access"].ToString());
var tokens = JsonConvert.DeserializeObject<Dictionary<string, object>>(accessItems["token"].ToString());
var tokenTenantDict = JsonConvert.DeserializeObject<Dictionary<string, string>>(tokens["tenant"].ToString());
var serviceCatalog = JsonConvert.DeserializeObject<Dictionary<string, object>>(accessItems["serviceCatalog"].ToString());
var user = JsonConvert.DeserializeObject<Dictionary<string, object>>(accessItems["user"].ToString());
var metadata = JsonConvert.DeserializeObject<Dictionary<string, object>>(accessItems["metadata"].ToString());
string tokenExpiration = tokens["expires"].ToString();
string tokenId = tokens["id"].ToString();
string tokenTenant = tokens["tenant"].ToString();
string userUsername = user["username"].ToString();
string tenantId = tokenTenantDict["id"];
string userId = user["id"].ToString();
string userName = user["name"].ToString();

我正在寻找的是一个更优雅的解决方案,可能包含一个类定义,我可以将JSON字符串反序列化。我没有找到这样的东西,我希望答案对其他人对Keystone界面的编程有很大的帮助。 感谢您提供任何建议的解决方案。

1 个答案:

答案 0 :(得分:0)

这不能正常工作的原因是JSON字符串中存在错误。我使用在线检查器来验证在我的代码中使用它之前收到的JSON字符串。

http://www.freeformatter.com/json-validator.html