无法将API调用中的JSON字符串转换为字典

时间:2017-06-28 13:26:47

标签: c# json dictionary

早上好!我仍在学习REST API调用并处理HTTP请求,所以请提供反馈:)

我试图对Web服务进行GET调用,该服务应该返回一个JSON字符串,该字符串是一组信息,应该是一种类似于字典的SQL记录。方式。

然而,我有几次打嗝并且不知道我是否正确接近了解决方案:

  1. 致电网络服务。将其定义为' GET'呼叫。
  2. 处理响应并使用StreamReader读取它。
  3. 使用NewtonSoft JSON方法,将响应反序列化为字典格式。 < - 目前卡在这里。
  4. 根据自己的喜好使用字典。

    // 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"];
    
  5. 调用类型的JSON字符串是什么样的:

    • &#34; [{\&#34;数\&#34:4,\&#34; FIELDABC \&#34;:\&#34; ABC \&#34;}]&# 34;

    我尝试过的其他解决方案:

    1. 改为使用数据类型字典
    2. 各种其他方法调用,如代码中注释掉的方法调用。
    3. 另一个SO帖子建议ToDictionary()调用。
    4. 我遇到的错误:

      • {&#34; Value不能为null。\ r \ nParameter name:source&#34;} System.Exception {System.ArgumentNullException}

      • 无法将JSON字符串转换为JSON对象。

      我是否误解了如何处理来自HTTP请求的响应?或者我是否混淆/滥用数据类型?非常感谢任何帮助!

      更新:通过以下所有答案,解决方案最终成为所有评论的组合!首先,我使用json2csharp.com来创建对象。然后,使用下面推荐的更新的HTTP调用,我将JSON反序列化为类型列表,以便我得到一个长度为1的列表,我可以从中访问我的信息。谢谢大家!

3 个答案:

答案 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);
        }