进行GET HTTP调用时Json格式化错误消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进行GET HTTP调用时Json格式化错误消息相关的知识,希望对你有一定的参考价值。

我正在尝试从我们的软件返回用户列表,并将这些用户的姓名和电子邮件地址格式化为一个列表,以便将其与其他列表进行比较,并确定哪些更准确。我正在使用下面的代码提出请求。

问题:如何将我的代码格式化为接受json数组,如错误消息所述?

public void MakeCall()
{
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(Url);

    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    HttpResponseMessage response = client.GetAsync(_urlParameters).Result;

    if (response.IsSuccessStatusCode)
    {
        var dataObjects = response.Content.ReadAsAsync<IEnumerable<WorkfrontDataObjects>>().Result;

        foreach (var workfrontData in dataObjects)
        {
            Console.WriteLine("{0}", workfrontData.Email);
        }
    }
    Console.ReadLine();
}


public class WorkfrontDataObjects
{
    public string[] Email { get; set; }

    public string[] Name { get; set; }

    public WorkfrontDataObjects()
    {

    }
}

错误信息:

JsonSerializationException:无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.IEnumerable`1 [ManageWorkfrontADUserDistros.WorkfrontDataObjects]',因为该类型需要JSON数组(例如[1, 2,3])正确反序列化。要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。路径'数据',第1行,第8位。

更新,添加json:

{
    "data": [
        {
            "ID": "000000000000000000000000000000",
            "name": "name",
            "objCode": "USER",
            "emailAddr": "email"
        },
        {
            "ID": "000000000000000000000000000000",
            "name": "name",
            "objCode": "USER",
            "emailAddr": "email"
        },

上面有2500条显然有真实的数据

答案

鉴于您的JSON,您的模型需要如下所示:

public class RootObject
{
    [JsonProperty("data")]
    public List<Item> Data { get; set; }
}

public class Item
{
    [JsonProperty("ID")]
    public string ID { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("objCode")]
    public string ObjCode { get; set; }

    [JsonProperty("emailAddr")]
    public string Email { get; set; }
}

只要[JsonProperty]属性中的名称与JSON匹配,您就可以重命名类和属性以满足您的需要,而不会影响反序列化。

那么你应该能够收到这样的数据:

if (response.IsSuccessStatusCode)
{
    var rootObject = response.Content.ReadAsAsync<RootObject>().Result;

    foreach (var item in rootObject.Data)
    {
        Console.WriteLine(item.Email);
    }
}
另一答案

你的string[]应该是WorkfrontDataObjects中的string,电子邮件应该是emailAddr

以上是关于进行GET HTTP调用时Json格式化错误消息的主要内容,如果未能解决你的问题,请参考以下文章

使用body.json()解析来自http.get()的响应时出错

阿里云调用 API 服务后返回啥结果

将错误消息作为 JSON 对象发送

嵌套 JQuery/json 调用时出现 GET 错误:更新

Angular 5 管理带有 blob 响应和 json 错误的 http get

Feign调用异常org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET&#(代