我试图对Web服务进行GET调用,该服务应该返回一个JSON字符串,该字符串是一组信息,应该是一种类似于字典的SQL记录。方式。
然而,我有几次打嗝并且不知道我是否正确接近了解决方案:
根据自己的喜好使用字典。
// Call the Web Service
string url = "{URL HERE}";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/json";
request.ContentLength = 0;
//Dictionary<string, string> dataList = null;
try
{
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
var json = reader.ReadToEnd();
//Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
var data = JsonConvert.DeserializeObject<List<KeyValuePair<string, List<KeyValuePair<string, string>>>>>(json);
var dataDictionary = data.ToDictionary(
x => x.Key,
x => x.Value.ToDictionary(y => y.Key, y => y.Value));
//dataList = (Dictionary<string, string>) dataDictionary;
var test = dataDictionary["Key"];
调用类型的JSON字符串是什么样的:
我尝试过的其他解决方案:
我遇到的错误:
{&#34; Value不能为null。\ r \ nParameter name:source&#34;} System.Exception {System.ArgumentNullException}
无法将JSON字符串转换为JSON对象。
我是否误解了如何处理来自HTTP请求的响应?或者我是否混淆/滥用数据类型?非常感谢任何帮助!
更新:通过以下所有答案,解决方案最终成为所有评论的组合!首先,我使用json2csharp.com来创建对象。然后,使用下面推荐的更新的HTTP调用,我将JSON反序列化为类型列表,以便我得到一个长度为1的列表,我可以从中访问我的信息。谢谢大家!
答案 0 :(得分:0)
因此,当我使用http://json2csharp.com/
来使用您的JSON时,我会得到:
public class ClassName
{
public int Number { get; set; }
public string FieldABC { get; set; }
}
使用HttpClient
,这样可以更轻松:
using (var client = new HttpClient())
{
var response = await client.GetAsync(progressUrl);
var yourObject == JsonConvert.DeserializeObject<ClassName>(await response .Content.ReadAsStringAsync());
}
继续其余的......
您也可以使用HttpClientExtensions Class。
干杯!
答案 1 :(得分:0)
首先制作一个与响应字符串完全匹配的POCO。像这样:
public class MyResponseObject {
public int Number { get; set; }
public string FieldABC { get; set; }
// other properties here
}
假设您发送了[{\"Number\":4,\"FieldABC\":\"ABC\"}]
建议的这些对象的数组,那么您可以使用
JsonConvert.DeserializeObject<List<MyResponseObject>>(json);
如果它是一个更复杂的对象,那么您可以在主体对象中包含其他嵌套对象:
public class MyNestedObject {
public string NestedName { get; set; }
public bool IsEnabled { get; set; }
}
public class MyResponseObject {
public List<MyNestedObject> NestedObjects { get; set; }
}
一旦你有了List<MyResponseObject>
,你可能会发现你根本不需要字典,或者你可以使用许多Linq Enumerable方法而不用担心JSON。
答案 2 :(得分:-1)
使用HttpClient而不是HttpWebRequest,如下所示:
using (var httpClient = new System.Net.Http.HttpClient())
{
httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
var response = await httpClient.GetAsync(url);
var data = await response.Content.ReadAsStringAsync();
Dictionary<string, string> ValueList = JsonConvert.DeserializeObject<Dictionary<string, string>>(data);
}