#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
}