【问题标题】:JsonConvert.DeserializeObject<IEnumerable<Book>>JsonConvert.DeserializeObject<IEnumerable<Book>>
【发布时间】:2017-05-26 01:49:27
【问题描述】:

我想知道为什么我在使用这些语句时会收到此错误:

string result = await client.GetStringAsync(RestUrl);

return JsonConvert.DeserializeObject<IEnumerable<Book>>(result);

无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“System.Collections.Generic.List`1[BookClient.Data.Book]”,因为该类型需要 JSON 数组(例如[1,2,3]) 正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像可以从 JSON 对象反序列化的数组或列表。 JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化

这是结果字符串文件:

"{\"TOTAL\":177,\"PRODUCTS\":[{\"CODE\":\"T55-2A\",\"PRICE\":59.9500,\"NAME\":\"Arrive In Style\"},{\"CODE\":\"F1-231\",\"PRICE\":49.9500}]}"

谢谢

【问题讨论】:

  • 向我们展示Book类的结构
  • 请在Book 上显示您的公共set 属性。
  • 您的 Book 类是什么样的?

标签: c# json deserialization


【解决方案1】:

您似乎正在尝试将对象反序列化为数组。您需要创建一个内部包含数组的类。像这样的:

using System.Collections.Generic;
using Newtonsoft.Json;
using System.Diagnostics;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            const string result = "{\"TOTAL\":177,\"PRODUCTS\":[{\"CODE\":\"T55-2A\",\"PRICE\":59.9500,\"NAME\":\"Arrive In Style\"},{\"CODE\":\"F1-231\",\"PRICE\":49.9500}]}";

            var deserialized = JsonConvert.DeserializeObject<Result>(result);

            Debug.Assert(deserialized.Books.Count == 2);
        }
    }

    public class Result
    {
        [JsonProperty("TOTAL")]
        public int Total { get; set; }

        [JsonProperty("PRODUCTS")]
        public List<Book> Books { get; set; }
    }

    public class Book
    {
        [JsonProperty("CODE")]
        public string Code { get; set; }

        [JsonProperty("PRICE")]
        public float Price { get; set; }

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

【讨论】:

  • 非常感谢。
  • 能否请您告诉我如何在列表视图中显示除菌结果?再次感谢
  • 谢谢,我用 ListViewProducts.ItemsSource = Books 做到了
【解决方案2】:

您的结果似乎是一个对象而不是一个数组。所以你需要创建一个类来存储反序列化的结果,属性为total(int)和products(array)。然后就可以通过 products 属性访问数组了。

【讨论】:

    【解决方案3】:

    这个错误实际上有点令人困惑。该错误的真正含义是代码无法知道要反序列化为哪种类型。考虑场景 -

    public interface I 
    {
        public int v { get; set;}
    }
    
    public class A: I 
    {
        public int v { get; set;}
    }
    
    public class B: I
    {
        public int v { get; set;}
    }
    

    现在考虑这个代码块 -

    var result = JsonConvert.DeserializeObject<I>("{\"v\" : 10}");
    

    你能告诉我结果是什么吗? Interface 无法实例化。所以它要么必须是A 还是B?结果会是哪一门课? A 还是 B?实际上没有人说不出来 - 编译器也是如此。

    这里也发生了同样的事情。 -

    JsonConvert.DeserializeObject<IEnumerable<Book>>(result);
    

    您正在反序列化为IEnumerable&lt;Book&gt;,但IEnumerable&lt;Book&gt; 不是具体实现。这只是一个接口,是结果的签名,而不是结果类型本身。所以转换器无法判断使用哪个类。这就是为什么它告诉你使用原始类型或可以创建的东西。

    从错误的外观来看,它试图使用List&lt;Book&gt; 反序列化到,但它也不能这样做,因为提供的 JSON 字符串不是数组,它是一个对象,因此错误 -

    无法反序列化当前 JSON 对象(例如 {"name":"value"}) 进入类型'System.Collections.Generic.List`1 [BookClient.Data.Book]' 因为该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。要修复此错误,请将 JSON 更改为 JSON 数组 (例如 [1,2,3])或更改反序列化类型,使其成为正常的 .NET 类型(例如,不是像整数这样的原始类型,也不是集合 可以从 JSON 反序列化的数组或列表等类型 目的。 JsonObjectAttribute 也可以添加到类型中来强制它 从 JSON 对象反序列化

    如果您正在寻找解决方案,请关注@Maria Ines Parnisari 的回答。这很好地解决了您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 2018-01-16
      • 2014-07-01
      • 1970-01-01
      • 2023-03-20
      • 2017-02-20
      相关资源
      最近更新 更多