将自定义列表序列化为json c#
Posted
技术标签:
【中文标题】将自定义列表序列化为json c#【英文标题】:Serialize custom list to json c# 【发布时间】:2021-04-16 19:28:13 【问题描述】:我有一个自定义 Collection 来控制对其所做的更改,并在需要时恢复更改,类似于 IEditableObject 的实现
public class CollectionBO<TEntity> : Collection<TEntity> where TEntity : BOBase
public List<TEntity> AddedEntities get; set;
public List<TEntity> RemovedEntities get; set;
public CollectionBO()
AddedEntities = new List<TEntity>();
RemovedEntities = new List<TEntity>();
我也想在rest api的DTO中使用该列表,以轻松访问要删除或添加的记录的信息,但我遇到的问题是它没有序列化内部列表(AddedEntities,RemovedEntities ),当它们到达服务器时,这些列表总是空的,问题是可以序列化一个列表甚至它的 IList 属性
await (serverUrl).AppendPathSegment(endPoit)
.WithOAuthBearerToken(token)
.PutJsonAsync(CollectionBO);
【问题讨论】:
什么内部列表?这些是公共财产。你用的是什么序列化器?你是如何构建数据的?绝对有可能,但是根据这个例子无法知道挂断发生在哪里。 您好,感谢您的回复,内部列表是 AdditionalEntities 和 RemovedEntities 属性。如果你想测试你应该创建一个 CollectionBO 实例,然后将任何对象添加到 AdditionalEntities 和 RemovedEntities 列表。要序列化我使用 JsonConvert.SerializeObject(CollectionBO 实例),您会看到它不会序列化 AdditionalEntities 和 RemovedEntities 列表的对象 How do I get json.net to serialize members of a class deriving from List<T>?的可能重复 【参考方案1】:此问题是由您的继承结构与所需的输出结构不匹配引起的。
通过从Collection<T>
继承,Newtonsoft 调用JsonArrayContract
,因为您的类型实现了ICollection<>
。结果,当它尝试序列化时,它会输出一个数组:"[]"
。
也就是说,您的对象结构是一个包含数组的对象。为了强制序列化程序将您的CollectionBO<TEntity>
视为一个对象,您需要使用[JsonObject]
属性对其进行装饰。
[JsonObject]
public class CollectionBO<TEntity> : System.Collections.ObjectModel.Collection<TEntity>
where TEntity : BOBase
public List<TEntity> AddedEntities get; set;
public List<TEntity> RemovedEntities get; set;
public CollectionBO()
AddedEntities = new List<TEntity>();
RemovedEntities = new List<TEntity>();
这允许序列化程序正确对待它:
"AddedEntities":["Id":1,"Id":2],"RemovedEntities":["Id":3,"Id":4],"Count":0
请注意,扩展集合类型很少可取,因为您可以创建各种奇怪的行为,例如 Newtonsoft 序列化程序的行为。此外,请注意 Count 属性被序列化为 0,即使您有基础对象。虽然您当然可以完成这项工作,但请注意,在扩展集合类型但不将其视为集合时,您将继续遇到意外行为。
【讨论】:
以上是关于将自定义列表序列化为json c#的主要内容,如果未能解决你的问题,请参考以下文章
C# JSON 将文件反序列化为对象列表失败,并将字符串转换为集合错误