Битли, Json и C#

#json #c#-4.0

#json #c #-4.0

Вопрос:

Я работаю над чем-то, что включало использование Bit.ly API и позволяют пользователю выбирать формат (текст, 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 #, чтобы иметь возможность обрабатывать оба сценария, потому что, как вы можете видеть, они сильно отличаются друг от друга. Есть идеи?

Ответ №1:

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

Ответ №2:

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

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

}
  

Ответ №3:

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

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

 if (results2.ContainsKey("expand"))
{
    //Second example
}
else
{
    //First example
}