【发布时间】:2017-06-28 13:26:47
【问题描述】:
早上好!我仍在学习如何处理 REST API 调用并通常处理 HTTP 请求,所以请提供任何反馈:)
我正在尝试对 Web 服务进行 GET 调用,它应该返回一个 JSON 字符串,它是一组信息,它应该是以类似字典的方式返回的 SQL 记录。
但是,我遇到了几个问题,不知道我是否正确地解决了问题:
- 调用网络服务。将其定义为“GET”调用。
- 处理响应并使用 StreamReader 读取它。
- 使用 NewtonSoft JSON 方法,将响应反序列化为字典格式。
-
根据自己的喜好使用字典。
// 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 字符串是什么样的:
- "[{\"Number\":4,\"FieldABC\":\"ABC\"}]"
我尝试过的其他解决方案:
- 改用字典数据类型。
- 各种其他方法调用,如代码中注释掉的方法。
- 另一个 SO 帖子建议使用 ToDictionary() 调用。
我遇到的错误:
{“值不能为空。\r\n参数名称:源”} System.Exception {System.ArgumentNullException}
无法将 JSON 字符串转换为 JSON 对象。
我是否误解了如何处理来自 HTTP 请求的响应?还是我混淆/滥用数据类型?非常感谢任何帮助!
更新:有了以下所有答案,解决方案最终成为所有 cmets 的组合!首先,我使用 json2csharp.com 创建对象。然后,使用下面推荐的更新后的 HTTP 调用,我将 JSON 反序列化为 Lists 类型,以便我得到一个长度为 1 的列表,我可以从中访问我的信息。谢谢大家!
【问题讨论】:
-
尝试做,
JsonConvert.DeserializeObject<JObject>,然后你就可以遍历 JSON 树了。 -
首先,找出 JSON 的实际外观。创建一个具有完全相同属性的类并首先将它们设为字符串,因为这永远不会失败。然后使用
JsonConvert.DeserializeObject<List<YourClass>>(responseString);从收到的 json 字符串创建对象列表。使用Dictionary的问题在于它由KeyValue-pairs 组成,其中Dictionary中的密钥必须是唯一的。如果不是这种情况,转换将失败。 -
@Callum,我尝试将代码更改为:var values = JsonConvert.DeserializeObject
(json);,并收到错误“无法区分类型的对象”Newtonsoft.Json.Linq。 JArray' 来输入 'Newtonsoft.Json.Linq.JObject'。是否需要“遍历 JSON 树”之前的步骤(抱歉,我对术语不熟悉)。 -
那么把
JObject改成JArray.... -
@Bunnynut JSON 字符串类似于具有更多字段的“[{\"Number\":4,\"FieldABC\":\"ABC\"}]"。为了阅读目的,帖子中的示例进行了简化。我还缺少另一个 JSON 对象吗?还是我应该将该字符串转换为其他字符串?
标签: c# json dictionary