c# - 使用 Newtonsoft JSON 反序列化 IList 对象

标签 c# .net json deserialization json.net

我正在使用 ConcreteCollectionTypeConverter 反序列化 IList 类型的对象。我可能做错了,因为我不断收到异常“无法将列表转换为 IList”

我的对象界面看起来像这样:

[JsonObject(MemberSerialization.OptIn)]
public IMyInterface {

    [JsonProperty("associatedContact")]
    [JsonConverter(typeof(ConcreteCollectionTypeConverter<IList<ISomeOtherInterface>, List<SomeOtherInterface>>))]
    IList<ISomeOtherInterface> MyObject { get; set; }
}

我的对象实现如下所示:

public MyImplementation : IMyInterface {

    public List<SomeOtherImplementation> MyObject { get; set; }

    public MyImplementations () {
        MyObject = new List<SomeOtherImplementation>();          
    }
}

我的 Json 转换器如下所示:

class ConcreteCollectionTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize<TImplementation>(reader);
    }
}

我在我项目的其他地方调用反序列化方法是这样的:

var myDeserializedObject = JsonConvert.DeserializeObject<MyImplementation>(jsonObject.ToString());

我上面提到的 jsonObject 被正确解析了。

我知道这是可能的,因为我在这里看到一位用户对 SO 的评论,他说他已经做到了(Casting interfaces for deserialization in JSON.NET - 已接受答案的第一条评论)。

此方法适用于非集合项(即使用 JsonConverer(typeof(ConcreteTypeCOnverter)) 反序列化接口(interface)类型 IIterface MyObject 的对象)。

如果我只使用列表而不是 IList,我什至不需要类型转换器,但我的要求是确保使用 ICollections,因为可能存在非标准实现。

最佳答案

我相信这会满足您的需要:

public class ConcreteListTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface 
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var res = serializer.Deserialize<List<TImplementation>>(reader);
        return res.ConvertAll(x => (TInterface) x);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

关于c# - 使用 Newtonsoft JSON 反序列化 IList 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15414515/

相关文章:

php - AJAX 数组与 MySQL 表交互时出现问题

java - 如何使用 Java 创建类以将文档保存在 MongoDB 中

javascript - Angular ajax : Unexpected token I in JSON at position 0

c# - 测试对象相等性的最佳方法是什么 - 无需覆盖 Equals 和 GetHashCode,或实现 IEquatable<T>?

c# - 如何使用 .NET 在电子邮件正文中嵌入多个图像

c# - .NET CF 2.0 : Stream implements IDisposable . .. 怎么样?

.net - 获取数组中字符串序列在另一个数组上的重叠的算法

.net - InstallShield Limited Edition 2015 警告 -6245 需要 .Net Framework

C# 将单个字典的值组合到单个扩展列表中

c# - ASP.NET c# 向数据集添加行