【问题标题】:Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type requires a JSON array (e.g. [1,2,3]) to deserialize correctly无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型需要 JSON 数组(例如 [1,2,3])才能正确反序列化
【发布时间】:2020-06-22 08:12:30
【问题描述】:

我在哪里缺少信息?我需要反序列化以下 JSON 字符串。

{
  "data": [
    {
      "FirstName": "Test",
      "LastName": "Test"
    }
  ]
}

为此,我定义了我的 LoadData 操作方法:

public async Task<ActionResult> LoadData()
{
    string apiUrl = "URL";

    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri(apiUrl);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        var input = new { depot = "DATA", fromDate = "2020-06-06", toDate = "2020-06-06" };
        var response1 = await client.PostAsJsonAsync("DATAOne", input);
      
        if (response1.IsSuccessStatusCode)
        {
            var data = await response1.Content.ReadAsStringAsync();
            var table = JsonConvert.DeserializeObject<List<PartOne>>(data);
        }
    }
    return View();
}

为此,我定义了我的类:

public class PartOne
{
    public string FirstName{ get; set; }
    public string LastName{ get; set; }
}

但是当我尝试使用反序列化器时,它给出了一个异常。

{"无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[InfluxDB.Serie]' 因为该类型需要 JSON 数组(例如[1,2,3]) 以正确反序列化。\r\n要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET可以从 JSON 对象反序列化的类型(例如,不是像整数这样的原始类型,不是像数组或列表这样的集合类型)。也可以将 JsonObjectAttribute 添加到该类型以强制它从 JSON 对象反序列化。\r\ nPath '结果',第 2 行,第 12 位。"}

【问题讨论】:

    标签: c# asp.net-mvc json-deserialization


    【解决方案1】:

    你有两个选择:


    第一个选项,您缺少data 的包装对象

    public class Wrapper<T>
    {
        public T Data { get; set; }
    }
    

    然后使用:

    var table = JsonConvert.DeserializeObject<Wrapper<List<PartOne>>>(json).Data;
    

    第二个选项,首先将其反序列化为JObject并访问数据,然后将其反序列化为List&lt;PartOne&gt;

    var jObj = JsonConvert.DeserializeObject(json) as JObject;
    var jArr = jObj.GetValue("data");
    var table = jArr.ToObject<List<PartOne>>();
    

    【讨论】:

    • @PradeepVaishya 我添加了第二个选项来解决这个问题。任何与您的用例匹配的东西都更好。第二个更好地解释了缺少的内容(但我认为第一个产生更清晰的代码)
    • 我使用了第一个,因为它的代码更简洁。
    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多