首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组的Json DeSerialization到IEnumerable失败

数组的Json DeSerialization到IEnumerable失败
EN

Stack Overflow用户
提问于 2020-12-01 19:31:35
回答 1查看 853关注 0票数 0

cs具有下列属性:

代码语言:javascript
复制
 public CustomerExtensions CustomerExtensions { get; set; }

CustomerExtensions类:

代码语言:javascript
复制
[DefaultMember("Item")]
public class CustomerExtensions  : 
     IEnumerable<CustomerExtension>, IEnumerable, IEnumerator
{
       public CustomerExtensions();
       public CustomerExtensions(List<CustomerExtension> customerExtensions);
}

CustomerExtension类:

代码语言:javascript
复制
public class CustomerExtension 
{
    public CustomerExtension();
    
    public int CustomerId { get; set; }       
    public int CustomerType { get; set; }       
}

所以当我把json流写成这样:

代码语言:javascript
复制
result = JsonConvert.DeserializeObject<Customer>(response, custDefualtSettings());

响应:

代码语言:javascript
复制
{
    "$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。

有人能指出正确的方向吗..?

答案:

代码语言:javascript
复制
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();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-01 19:52:32

CustomerExtensions实现IEnumerable<CustomerExtension>,因此反序列化器在默认情况下将期望它从json数组序列化和反序列化。它将尝试创建一个新实例,然后调用Add(CustomerExtension item)来填充它。但是,您没有实现IList,因此没有可以使用的Add()方法,而且它也不知道该做什么。

为什么您需要一个自定义类来处理这个问题?在您的类中没有额外的逻辑,有public List<CustomerExtension> CustomerExtensions { get; set; }就足够了吗?

编辑

由于无法更改类定义,因此可以创建自定义JsonConverter:

代码语言:javascript
复制
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对象中。

代码语言:javascript
复制
var settings = custDefualtSettings();
settings.Converters.Add(new CustomerExtensionsConverter());
result = JsonConvert.DeserializeObject<Customer>(response, settings);

我还没有对此进行测试,但它应该会让您对实现的样子有一个大致的了解。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65097256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档