cs具有下列属性:
public CustomerExtensions CustomerExtensions { get; set; }CustomerExtensions类:
[DefaultMember("Item")]
public class CustomerExtensions :
IEnumerable<CustomerExtension>, IEnumerable, IEnumerator
{
public CustomerExtensions();
public CustomerExtensions(List<CustomerExtension> customerExtensions);
}CustomerExtension类:
public class CustomerExtension
{
public CustomerExtension();
public int CustomerId { get; set; }
public int CustomerType { get; set; }
}所以当我把json流写成这样:
result = JsonConvert.DeserializeObject<Customer>(response, custDefualtSettings());响应:
{
"$id": "1",
"$type": "Common.Customer, PublicKeyToken=f291d5e4",
"CashPrice": 47042.74,
"AmountFinanced": 47042.74,
"CustomerExtensions": {
"$id": "4",
"$type": "System.Collections.Generic.List`1[[Common.CustomerExtension, PublicKeyToken=f291d5e4]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=f291d5e4",
"$values": [
{
"$id": "5",
"$type": "Common.CustomerExtension, PublicKeyToken=f291d5e4",
"CustomerId": 11946,
"CustomerType": 1,
},
{
"$id": "5",
"$type": "Common.CustomerExtension, PublicKeyToken=f291d5e4",
"CustomerId": 11046,
"CustomerType": 3,
}
]
}反序列化失败,有以下错误:
无法创建和填充列表类型Common.CustomerExtensions。路径'CustomerExtensions.$values',第1行,位置2725。
有人能指出正确的方向吗..?
答案:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
public class CustomerExtensionsConverter : JsonConverter<CustomerExtensions>
{
public override bool CanWrite => false;
public override CustomerExtensions ReadJson(JsonReader reader, Type objectType, CustomerExtensions existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var list = serializer.Deserialize<List<CustomerExtension>>(reader);
return new CustomerExtensions(list);
}
public override void WriteJson(JsonWriter writer, CustomerExtensions value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}发布于 2020-12-01 19:52:32
CustomerExtensions实现IEnumerable<CustomerExtension>,因此反序列化器在默认情况下将期望它从json数组序列化和反序列化。它将尝试创建一个新实例,然后调用Add(CustomerExtension item)来填充它。但是,您没有实现IList,因此没有可以使用的Add()方法,而且它也不知道该做什么。
为什么您需要一个自定义类来处理这个问题?在您的类中没有额外的逻辑,有public List<CustomerExtension> CustomerExtensions { get; set; }就足够了吗?
编辑
由于无法更改类定义,因此可以创建自定义JsonConverter:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
public class CustomerExtensionsConverter : JsonConverter<CustomerExtensions>
{
public override bool CanWrite => false;
public override CustomerExtensions ReadJson(JsonReader reader, Type objectType, CustomerExtensions existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var list = serializer.Deserialize<List<CustomerExtension>>(reader);
return new CustomerExtensions(list);
}
public override void WriteJson(JsonWriter writer, CustomerExtensions value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}若要使用转换器,请在调用JsonSerializerSettings时将其添加到Deserialize对象中。
var settings = custDefualtSettings();
settings.Converters.Add(new CustomerExtensionsConverter());
result = JsonConvert.DeserializeObject<Customer>(response, settings);我还没有对此进行测试,但它应该会让您对实现的样子有一个大致的了解。
https://stackoverflow.com/questions/65097256
复制相似问题