繁体   English   中英

来自get API调用C#的Json

[英]Json from a get API Call C#

我有一个GET API调用如下:

static void Main()
{
    RunAsync().Wait();
}

static async Task RunAsync()
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("myurl");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("usr", "pwd");
        HttpResponseMessage response = await client.GetAsync("");
        if (response.IsSuccessStatusCode)
        {
            Console.WriteLine(response.Content);                   
        }
    }
}

如何从API中读取JSON响应?

我试图这样做:

 response.Content = new ObjectContent<Response>(new Response()
                    {
                        responseCode = Response.ResponseCodes.ItemNotFound
                    }, new JsonMediaTypeFormatter(), "application/json");

但我还没有成功。 有人可以帮忙吗?

更新:

我的更新代码现在看起来像这样:

static async Task RunAsync()
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("myurl");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BT", "pwd");
        HttpResponseMessage response = await client.GetAsync("");
        if (response.IsSuccessStatusCode)
        {                                   
            Console.WriteLine(response.Content);
            var json = await response.Content.ReadAsStringAsync();
            Product myprod = JsonConvert.DeserializeObject<Product>(json);

            var results = myprod.result;

            for(int i=1;i<=results.Count;i++)
            {
                var value1 = results[0][0];
                var value2 = results[0][1];
                var value3 = "Nilisha";
                using (SqlConnection conn = new SqlConnection())
                {
                    conn.ConnectionString = "Server=[xx.xx.xx.xx];Database=[Mydb];User ID=sa;Password=abc@321;Trusted_Connection=true";
                    conn.Open();
                    SqlCommand insertCommand = new SqlCommand("INSERT INTO PortalData (LCID, TimeStamp, Name) VALUES ( @1, @2, @3)", conn);
                    insertCommand.Parameters.Add(new SqlParameter("1", value1));
                    insertCommand.Parameters.Add(new SqlParameter("2", value2));
                    insertCommand.Parameters.Add(new SqlParameter("3", value3));

                    Console.WriteLine("Commands executed! Total rows affected are " + insertCommand.ExecuteNonQuery());
                    conn.Close();
                }
            }                           
            Console.ReadLine();                         
        }
    }
}

我们是否允许在静态异步Task RunAsync()函数中使用insert db调用?

您可以使用名为JSON.Net的优秀库。 它支持将原生C#对象转换为JSON并返回。

您可以使用名称Newtonsoft.Json从NuGet添加库

在这个例子中,我用JSON创建了一些示例数据

{
  "User": "John Skeet",
  "Age": 50,
  "hobby": [
    "dancing",
    "sleeping",
    "writing C#"
  ]
}

如果我想使用该库,我将首先导入该库。

using Newtonsoft.Json;

之后我会

  • 提出要求
  • 将响应作为字符串读取并存储。

如果您知道如何格式化JSON对象,那么您可以创建具有属性的预定义C#类。 Json.Net将类属性的(确切)名称映射到JSON数据中的相同名称。

所以对我们班来说

public class Person
{
    public string User { get; set; } //Maps to { "User" : "value" }
    public int Age { get; set; }    //Maps to { "Age" : value }
    public List<string> Hobby { get; set; } //Maps to { ["value1","value2","..."] }
}

这就足够了。 然后,您可以使用JsonConvert.DeserializeObject<Person>(StringWithJson)方法转换检索到的Json数据,这将返回一个Person对象。

如果你使用flurl ,它就像这样简单:

var result = await "https://api.mysite.com"
.AppendPathSegment("person")
.SetQueryParams(new { a = 1, b = 2 })
.WithOAuthBearerToken("my_oauth_token")
.PostJsonAsync(new { first_name = "Frank", last_name = "Underwood" })
.ReceiveJson<T>();

当前示例中最简单的方法是

var json = await response.Content.ReadAsStringAsync();

如果尝试将其转换为强类型类,则使用

var model = await response.Content.ReadAsAsync<Product>();

更新:

根据评论中提供的样本数据,得出以下内容。

[TestClass]
public class JsonNetDateSerializationTests {
    [TestMethod]
    public void GetResults() {
        //Arrange
        var json = "{\"result\": [[\"2016-10-31 01:29:42 495000\", 1033], [\"2016-11-01 22:29:07 169000\", 1033], [\"2016-10-31 01:31:51 550000\", 1033], [\"2016-11-01 22:41:11 357000\", 1033], [\"2016-11-01 22:41:11 357000\", 1033], [\"2016-11-01 22:52:09 848000\", 1033], [\"2016-11-03 01:48:13 038000\", 1033], [\"2016-11-03 01:48:13 038000\", 1033]], \"columns\": [\"ctime\", \"records\"], \"elapsed\": 0.000726}";

        //Act
        var actual = JsonConvert.DeserializeObject<Data>(json);

        //Assert
        Assert.IsNotNull(actual);

        var results = actual.result;

        var value1a = results[0][0];
        var value1b = results[0][1];

    }

    public class Data {
        public IList<IList<object>> result { get; set; }
        public IList<string> columns { get; set; }
        public double elapsed { get; set; }
    }
}

结果值的位置

value1a => "2016-10-31 01:29:42 495000"
value1b => 1033

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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