【问题标题】:Json formatting error message when making GET HTTP Call进行 GET HTTP 调用时出现 Json 格式错误消息
【发布时间】:2017-12-21 22:05:32
【问题描述】:

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

问题:如何格式化我的代码以接受 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 反序列化的数组或列表等类型 目的。 JsonObjectAttribute 也可以添加到类型中来强制它 从 JSON 对象反序列化。路径“数据”,第 1 行,位置 8。

更新,添加json:

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

以上 2500 条明显真实的数据

【问题讨论】:

  • 感谢您的编辑@douvillema。如果黄色框中的错误消息,您能告诉我我需要输入什么命令吗?我从来没有这样做过?
  • 其实错误说的正好相反。您显然收到了一个 JSON 对象(用大括号 {} 表示),但您正试图将其反序列化为 IEnumerable&lt;WorkfrontDataObjects&gt;。您可以编辑您的问题以包含您收到的实际 JSON 吗?如果无法查看您正在处理的数据,很难建议您如何修复代码。
  • @BrianRogers 我添加了一个我应该返回的预期 json 样本。我添加了两个项目,但它们总共是 2500 个。
  • 您是否尝试过将一些示例数据序列化到您的对象中以查看它生成的 JSON,它们应该在 JSON 构造方面匹配

标签: c# arrays json rest get


【解决方案1】:

鉴于您的 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);
    }
}

【讨论】:

  • 看起来这与我需要完成的事情无关。我不知道如果其中没有任何内容,我必须设置 json 以包含数据对象。谢谢你教我这个!
【解决方案2】:

您的 string[] 在 WorkfrontDataObjects 中应为 string,电子邮件应为 emailAddr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-09
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多