您的位置:首页 > 文旅 > 旅游 > 笔记:Newtonsoft.Json 序列化接口集合

笔记:Newtonsoft.Json 序列化接口集合

2025/2/23 10:41:17 来源:https://blog.csdn.net/u010975589/article/details/140220514  浏览:    关键词:笔记:Newtonsoft.Json 序列化接口集合

        在使用 Newtonsoft.Json 序列化接口集合时,一个常见的挑战是如何处理接口的具体实现,因为接口本身并不包含关于要实例化哪个具体类的信息。为了正确序列化和反序列化接口集合,你需要提供一些额外的信息或使用自定义的转换器来指导 Newtonsoft.Json 如何处理这些情况。


序列化接口集合


假设我们有以下接口和实现类:

public interface IAnimal
{string Name { get; }
}public class Dog : IAnimal
{public string Name { get; set; }public string Breed { get; set; }
}public class Cat : IAnimal
{public string Name { get; set; }public string Color { get; set; }
}

我们想要序列化一个包含 IAnimal 对象的集合:

List<IAnimal> animals = new List<IAnimal>
{new Dog { Name = "Rex", Breed = "Golden Retriever" },new Cat { Name = "Whiskers", Color = "Black" }
};

使用 TypeNameHandling


一种简单的方法是使用 JsonSerializerSettings 的 TypeNameHandling 属性。这会在 JSON 中包含类型信息,从而允许正确的反序列化。

string json = JsonConvert.SerializeObject(animals, new JsonSerializerSettings
{TypeNameHandling = TypeNameHandling.All
});List<IAnimal> deserializedAnimals = JsonConvert.DeserializeObject<List<IAnimal>>(json, new JsonSerializerSettings
{TypeNameHandling = TypeNameHandling.All
});

这种方法会在 JSON 中添加额外的 $type 属性来指示具体的实现类型,从而使反序列化过程能够实例化正确的类。

注意事项


•    使用 TypeNameHandling 时要小心,因为它可能会引入安全风险,特别是在处理不受信任的输入数据时。确保理解这些风险并适当地限制类型。
•    自定义 JsonConverter 提供了更大的灵活性,但也需要更多的工作来正确实现。
•    选择哪种方法取决于你的具体需求,包括安全性、灵活性和易用性的考虑。

System.Windows.Controls 命名空间 | Microsoft Learn

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com