Битли, Джсон и C # - PullRequest
       4

Битли, Джсон и C #

2 голосов
/ 06 апреля 2011

Я работаю над тем, что связано с использованием API-интерфейса Bit.ly и позволяю пользователю выбрать формат (Text, XML, Json), текст и XML завершены.Это результат Json, который возвращается при сокращении URL-адреса:

{ 
  "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 отправил обратно при расширении URL:

{ 
  "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 ]

4 голосов
/ 06 апреля 2011

Я обычно использую 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}.

0 голосов
/ 06 апреля 2011

Не уверен, что у меня есть ваша проблема. Почему вы не тестируете, если вы получили сокращающий результат или расширяющийся результат? Так как они разные, это легко сделать с помощью простых операторов if ():

if (results2.ContainsKey("expand")) {
    // handle the expand part
} else {
    // handle the shorten part

}
0 голосов
/ 06 апреля 2011

Предполагая, что поставщик соответствует той форме, которую он отправляет, вам нужен код, который обрабатывает оба?Он должен быть прямым для каждой из них.

Если вы заранее не знаете, какой формат вы получите, вы можете сделать следующее:

if (results2.ContainsKey("expand"))
{
    //Second example
}
else
{
    //First example
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...