我正在处理涉及使用Bit.ly API的内容,并允许用户选择格式(Text,XML,Json)文本& XML已完成。这是缩短URL时返回的Json结果:
{
"status_code": 200,
"status_txt": "OK",
"data":
{
"long_url": "http:\/\/panel.aspnix.com\/Default.aspx?pid={Removed}",
"url": "http:\/\/rlm.cc\/gtYUEd",
"hash": "gtYUEd",
"global_hash": "evz3Za",
"new_hash": 0
}
}
这个C#代码可以很好地解析它并得到简短的URL:
var serializer2 = new JavaScriptSerializer();
var values2 = serializer2.Deserialize<IDictionary<string, object>>(json);
var results2 = values2["data"] as IDictionary<string, object>;
var shortUrl2 = results2["url"];
expandedUrl = results2["url"].ToString();
return results2["url"].ToString();
现在,这是Json在扩展网址时发回的信息:
{
"status_code": 200,
"status_txt": "OK",
"data":
{
"expand":
[
{
"short_url": "http:\/\/rlm.cc\/gtYUEd",
"long_url": "http:\/\/panel.aspnix.com\/Default.aspx?pid={Removed}",
"user_hash": "gtYUEd",
"global_hash": "evz3Za"
}
]
}
}
广告就是我的问题开始的地方,如何更改当前的C#以便能够处理这两种情况,因为您可以看到它们彼此截然不同。有什么想法吗?
答案 0 :(得分:4)
我通常使用Json.NET从JSON文档中挑选出值。语法非常简洁。如果您引用 NewtonSoft.Json.dll 和使用 Newtonsoft.Json.Linq ,则可以编写以下内容:
var job = JObject.Parse(jsonString);
if (job["data"]["expand"] == null)
{
Console.WriteLine((string)job["data"]["url"]);
}
else
{
Console.WriteLine((string)job["data"]["expand"][0]["long_url"]);
}
如果jsonString
是:
string jsonString = @"{""status_code"": 200, ""status_txt"": ""OK"", ""data"": {""long_url"": ""http:\/\/panel.aspnix.com\/Default.aspx?pid={Removed}"", ""url"": ""http:\/\/rlm.cc\/gtYUEd"", ""hash"": ""gtYUEd"", ""global_hash"": ""evz3Za"", ""new_hash"": 0 }}";
例程将显示http://rlm.cc/gtYUEd
。
如果jsonString
是:
string jsonString = @"{""status_code"": 200, ""status_txt"": ""OK"", ""data"": { ""expand"": [ { ""short_url"": ""http:\/\/rlm.cc\/gtYUEd"", ""long_url"": ""http:\/\/panel.aspnix.com\/Default.aspx?pid={Removed}"", ""user_hash"": ""gtYUEd"", ""global_hash"": ""evz3Za"" } ] } }";
例程将显示http://panel.aspnix.com/Default.aspx?pid={Removed}
。
答案 1 :(得分:0)
假设提供程序与它发送的表单一致,您是否需要具有处理这两种形式的代码?它应该是直接处理每个人。
如果您无法提前知道将返回哪种格式,您可以执行以下操作:
if (results2.ContainsKey("expand"))
{
//Second example
}
else
{
//First example
}
答案 2 :(得分:0)
不确定我遇到了你的问题。如果缩短结果或扩大结果,为什么不进行测试?由于它们不同,这可以通过简单的'if()'语句轻松完成:
if (results2.ContainsKey("expand")) {
// handle the expand part
} else {
// handle the shorten part
}