将自定义列表序列化为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&lt;T&gt; 继承,Newtonsoft 调用JsonArrayContract,因为您的类型实现了ICollection&lt;&gt;。结果,当它尝试序列化时,它会输出一个数组:"[]"

也就是说,您的对象结构是一个包含数组的对象。为了强制序列化程序将您的CollectionBO&lt;TEntity&gt; 视为一个对象,您需要使用[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 将文件反序列化为对象列表失败,并将字符串转换为集合错误

将 JSON 字符串反序列化为多个 C# 对象

无法将 JSON 字符串反序列化为 C# 对象

如何将 JSON 反序列化为正确类型的对象,而无需事先定义类型?

在 C# 中序列化为 JSON 并在 TS 中反序列化

如何将 django/python 中的模型对象列表序列化为 JSON