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