JsonConvert.DeserializeObject <IEnumerable的<书>&GT;

时间:2017-05-26 01:49:28

标签: c# json deserialization

我想知道为什么在使用这些语句时出现此错误:

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对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化

这是结果字符串文件:

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

由于

3 个答案:

答案 0 :(得分:0)

您的结果似乎是一个对象,而不是一个数组。因此,您需要创建一个类来存储反序列化结果,其中包含属性total(int)和products(array)。然后您可以通过products属性访问该数组。

答案 1 :(得分:0)

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

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; }
    }
}

答案 2 :(得分:-1)

错误实际上有点令人困惑。错误的真正含义是代码无法知道要反序列化的类型。考虑一下情景 -

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?结果会是哪一课? AB?实际上没有人说不出来 - 编译器也是如此。

同样的事情发生在这里。 -

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

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

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

  

无法反序列化当前的JSON对象(例如{&#34; name&#34;:&#34; value&#34;})   into type&#39; System.Collections.Generic.List`1 [BookClient.Data.Book]&#39;   因为该类型需要一个JSON数组(例如[1,2,3])来反序列化   正确。要修复此错误,请将JSON更改为JSON数组   (例如[1,2,3])或更改反序列化类型以使其正常   .NET类型(例如,不是整数的基本类型,不是集合   类似于数组或List的类型,可以从JSON反序列化   宾语。 JsonObjectAttribute也可以添加到类型中以强制它   从JSON对象反序列化

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