Bitly,Json和C#

时间:2011-04-06 02:27:33

标签: json c#-4.0

我正在处理涉及使用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#以便能够处理这两种情况,因为您可以看到它们彼此截然不同。有什么想法吗?

3 个答案:

答案 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

}