所以我从ASP.NET核心应用程序调用Web API。我使用HttpClient并以字符串形式读取它,但我想将其作为JSON对象读取。我知道你可以把它读作Generic class ReadAsAsync<Generic>();
但是,返回的对象是一个庞大的JSON对象,为它编写一个Generic类会有很多工作。我的问题是我怎么能把它作为JSON对象阅读?
public async Task<IActionResult> SendRequest()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(" https://api.forecast.io/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// HTTP GET
HttpResponseMessage response = await client.GetAsync("forecast/KEY/");
if (response.IsSuccessStatusCode)
{
var forcast = await response.Content.ReadAsStringAsync();
Console.WriteLine("{0}", forcast);
// return Json( JSON ) ;
}
}
// return Json( JSON ) ;
}
我看到三种类型的响应读者,这些都可以成为JSON对象吗?
ReadAsByteArrayAsync, ReadAsStreamAsync, ReadAsStringAsync
答案 0 :(得分:0)
使用Json.NET将字符串转换为对象(反之亦然):
http://www.newtonsoft.com/json/help/html/Overload_Newtonsoft_Json_JsonConvert_DeserializeObject.htm
答案 1 :(得分:0)
您可以尝试将JSON有效负载解析为JObject
,这实际上允许您甚至使用LINQ to JSON。
来自here的示例代码:
JObject o = JObject.Parse(@"{
'CPU': 'Intel',
'Drives': [
'DVD read/writer',
'500 gigabyte hard drive'
]
}");
string cpu = (string)o["CPU"];
// Intel
string firstDrive = (string)o["Drives"][0];
// DVD read/writer
IList<string> allDrives = o["Drives"].Select(t => (string)t).ToList();
// DVD read/writer
// 500 gigabyte hard drive
从技术上讲,这对于您不希望POCO代表您的有效负载的情况更为合适。
Json.net 4.0+实际上也允许你使用动态实例:
dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}");
jsonResponse.Works = true;
Console.WriteLine(jsonResponse.message); // Hi
Console.WriteLine(jsonResponse.Works); // True
Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true}
Assert.That(jsonResponse, Is.InstanceOf<dynamic>());
Assert.That(jsonResponse, Is.TypeOf<JObject>());
详情请见here