我正在编写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界面的编程有很大的帮助。 感谢您提供任何建议的解决方案。
答案 0 :(得分:0)
这不能正常工作的原因是JSON字符串中存在错误。我使用在线检查器来验证在我的代码中使用它之前收到的JSON字符串。