繁体   English   中英

从API检索JSON到C#

[英]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

如果您接受失败的智能感知,您可以将其反序列化为dictionarydynamic ;

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM