在使用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/"
}
]
在我的 c# 中,我有这种方法:
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"
值的添加。 当我转储item
的价值时,我不会在那里看到它。我已经习惯了javascript,它只是item.referring_url
的,可以拥有任意数量的嵌套对象,而无需定义每个小部分。
在此声明期间是否可以
List<Item> items = JsonConvert.DeserializeObject<List<Item>>(jsonString);
自动从我定义的类中分配它知道如何分配的所有内容,然后将剩余部分分配给记录到控制台的内容或其他内容,以便我知道如何处理它?
有没有更好的方法可以以更熟悉的方式自动创建类,以便从javascript过渡的人?
JSON.Net 有办法从进程中接收错误。在JsonSeralizerSettings
中指定Error
委托。在此处阅读有关它的信息。
你可以选择使用 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
先行先行:使用 System.Net.Http.HttpClient
当我通常向 API 请求某些东西是因为我需要一些东西,而 API 为我提供了......在很多我不需要的其他东西中。因此,我只关心我需要什么,而不关心它提供的东西。
无论如何,如果您需要知道或记录API返回的原始内容,只需获取System.Net.HttpContent.ReadAsStringAsync()。
PS:多亏了像JsonProperty这样的属性,你可以专注于你需要什么以及你需要的实体如何
如果您接受丢失的智能感知,则可以将其反序列化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);
我知道有很多方法可以给猫剥皮,而且我太新了,无法正确投票回答,但会根据其他人的反馈接受顶部的答案。
将来,我可能会将此调试框扩充到一个按钮激活的弹出窗口中,其中包含对多种数据类型的错误处理,但这让我开始了。