当我使用以下语句时,我想知道为什么会出现这个错误:
string result = await client.GetStringAsync(RestUrl);
return JsonConvert.DeserializeObject<IEnumerable<Book>>(result);
无法将当前JSON对象(例如,{“名称”:“值”})反序列化为'System.Collections.Generic.List`1BookClient.Data.Book‘类型,因为该类型需要一个JSON数组(例如,1,2,3)才能正确反序列化。要修复此错误,要么将JSON更改为JSON数组(例如,1,2,3),要么更改反序列化类型,使之成为可以从JSON对象反序列化的普通.NET类型(例如,不像整数这样的原始类型,而不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化
这是结果字符串文件:
"{\"TOTAL\":177,\"PRODUCTS\":[{\"CODE\":\"T55-2A\",\"PRICE\":59.9500,\"NAME\":\"Arrive In Style\"},{\"CODE\":\"F1-231\",\"PRICE\":49.9500}]}"
谢谢
发布于 2017-05-25 18:06:37
您似乎试图将对象反序列化为数组。您需要创建一个包含内部数组的类。就像这样:
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; }
}
}
发布于 2017-05-25 18:00:16
您的结果似乎是一个对象,而不是数组。因此,您需要创建一个类来存储反序列化结果,其中包含属性总计(int)和产品(数组)。然后可以通过products属性访问数组。
发布于 2017-05-25 18:10:48
这个错误实际上有点令人困惑。错误的真正含义是,代码不可能知道要反序列化到哪种类型。想想看-
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<Book>
,但是IEnumerable<Book>
不是一个具体的实现。这只是一个接口,一个结果的签名,而不是结果类型本身。因此转换器无法判断要使用哪个类。这就是为什么它告诉您使用原始类型或可以创建的东西。
从它试图使用List<Book>
反序列化到的错误的外观来看,但是它也不能这样做,因为提供的JSON字符串不是一个数组,它是一个对象,因此错误-
无法将当前JSON对象(例如,{“名称”:“值”})反序列化为'System.Collections.Generic.List`1BookClient.Data.Book‘类型,因为该类型需要一个JSON数组(例如,1,2,3)才能正确反序列化。要修复此错误,要么将JSON更改为JSON数组(例如,1,2,3),要么更改反序列化类型,使之成为可以从JSON对象反序列化的普通.NET类型(例如,不像整数这样的原始类型,而不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化
如果您正在寻找解决方案,请遵循@的答案。这是一个很好的解决你的问题。
https://stackoverflow.com/questions/44192365
复制相似问题