[英]Retrieving JSON from API into C#
在使用PHP和Javascript多年并努力使用数组/列表之后,我对C#来说是全新的。
我意识到C#是一种强类型语言,但我仍在学习这意味着什么。 我很惊讶没有相当于PHP的print_r()
或var_dump()
,我一直在开发中广泛使用它来验证在正确的时间获得正确的值。
我正在点击一些端点,这些端点从URL缩短器返回JSON,如下所示:
[
{
"key": "WcoUC",
"url": "https://www.shorty.com/WcoUC",
"clicks": 17,
"expires": "2017-12-22 15:30:00",
"created_at": "2017-12-18 22:44:54",
"updated_at": "2017-12-18 22:44:54",
"redirect_to": "http://www.example2.com/"
}
]
在我的##我有这个方法:
private static string start_get()
{
HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(string.Format("https://www.shorty.com/api/v1/urls"));
WebReq.ContentType = "application/json; charset=utf-8";
WebReq.Headers["Authorization"] = "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOi7w8VePMIh5i3pZ-S329KifQ9TbWHfsqMfV-HXmhej_9KcQRReIbytrILzyopoXY7p7kKN6ZnZTrFO9P9-1y3ohFJCBxZXvW_iwbA9hsVTj9ZtFbJGxaaIlUZa19knuDirQ";
WebReq.PreAuthenticate = true;
HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
Console.WriteLine(WebResp.StatusCode);
Console.WriteLine(WebResp.Server);
string jsonString;
using (Stream stream = WebResp.GetResponseStream())
{
StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
jsonString = reader.ReadToEnd();
}
List<Item> items = JsonConvert.DeserializeObject<List<Item>>(jsonString);
return jsonString;
}
与它相关的类:
public class Item
{
public string key { get; set; }
public string url { get; set; }
public int clicks { get; set; }
public string expires { get; set; }
public string created_at { get; set; }
public string updated_at { get; set; }
public string redirect_to { get; set; }
}
这一切都有效,但我有点困惑为什么我必须设置一个类来访问JSON中的每个项目。 我担心的是,如果API使用新项目进行更新,它们将不会显示。 例如,假设有一个新密钥: "referring_url":"http://www.stackoverflow.com"
增值"referring_url":"http://www.stackoverflow.com"
。 当我转储item
的价值时,我不会看到那里。 我习惯于javascript,它只是item.referring_url
并且可以拥有尽可能多的嵌套对象,而不需要定义每个小部分。
在此声明中是否可能
List<Item> items = JsonConvert.DeserializeObject<List<Item>>(jsonString);
从我定义的类中自动分配它知道的所有内容,但是然后将剩余的内容分配给记录到控制台的东西,或者我知道如何处理它?
是否有更好的方法可以以更熟悉的方式自动创建类,以便从javascript转换?
JSON.Net有一种从进程中接收错误的方法。 在JsonSeralizerSettings
指定Error
委托。 在这里阅读它。
先行先使用:使用System.Net.Http.HttpClient
当我经常向API请求某些内容时,因为我需要一些东西,而且API为我提供了这些东西......还有许多我不需要的东西。 因此,我只关心我需要什么,而不关心它提供的东西。
无论如何,如果您需要知道或记录API返回的原始内容,您可以简单地获取System.Net.HttpContent.ReadAsStringAsync() 。
PS:感谢像JsonProperty这样的属性,你可以专注于你需要的东西以及你需要的实体
您可以选择使用Json.Net的Linq-to-Json API而不是编写类。 然后,JSON的所有部分都将可用,类似于JavaScript。 例如:
string json = @"
[
{
""key"": ""WcoUC"",
""url"": ""https://www.shorty.com/WcoUC"",
""clicks"": 17,
""expires"": ""2017-12-22 15:30:00"",
""created_at"": ""2017-12-18 22:44:54"",
""updated_at"": ""2017-12-18 22:44:54"",
""redirect_to"": ""http://www.example2.com/""
}
]";
JArray array = JArray.Parse(json);
foreach (JObject obj in array.Children<JObject>())
{
foreach (JProperty prop in obj.Properties())
{
Console.WriteLine(prop.Name + ": " + prop.Value.ToString());
}
Console.WriteLine();
}
小提琴: https : //dotnetfiddle.net/xyZvdO
如果您接受失败的智能感知,您可以将其反序列化为dictionary
或dynamic
;
string json = @"{'key' : 'k', 'url' : 'u', 'clicks' : 'c' }";
var keys = JObject.Parse(json).Properties();
//Dictionary
var keysDict = keys
.ToDictionary(
k => k.Name,
v => v.Value.ToString());
//Dynamic
var dynamicObject = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine(dynamicObject.key);
我正在构建的应用程序是一个Windows窗体,所以Console.Write是这么多教程/示例的一部分并没有多大帮助,但我配置了一个名为DebugBoxTest
的多行文本框,并在Form1.cs中放置:
public void DebugBoxUpdate(string incomingString)
{
JArray array = JArray.Parse(incomingString);
DebugBoxTest.Text = JsonConvert.SerializeObject(array, Formatting.Indented);
}
现在我可以使用Main
区域中的类似内容将格式化的东西转储到其中:
string results = start_get();
ThisForm.DebugBoxUpdate(results);
我知道有很多方法可以给猫皮肤,我太新了,无法正确推荐答案,但会根据其他人的反馈接受顶部的任何一个。
在将来,我可能会将此调试框扩充到一个按钮激活的弹出窗口,其中包含多种数据类型的错误处理,但这让我开始了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.