【问题标题】:Serialize custom list to json c#将自定义列表序列化为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 列表的对象

标签: c# json rest json.net


【解决方案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,即使您有基础对象。虽然您当然可以完成这项工作,但请注意,在扩展集合类型但不将其视为集合时,您将继续遇到意外行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多