【问题标题】:How to ignore null array elements with Newtonsoft JSON serializer如何使用 Newtonsoft JSON 序列化程序忽略空数组元素
【发布时间】:2018-12-25 03:49:47
【问题描述】:

我正在尝试序列化一个对象数组,但我需要它来忽略空元素。我意识到我可以简单地在反序列化时使用逻辑来检查空值,但是我不想通过网络写入不必要的数据。该数组最多可以有 9 个元素,但并非在每个实例中都使用所有 9 个索引。我知道可以使用列表,但为了效率,我不希望这样做。

根据我在此站点上浏览过的类似问题,我尝试将以下标记添加到数组中:[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]

但是,这种方法不会忽略 null 元素。

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public Node[] Nodes { get; } 
public void Init() 
{
    Nodes = new Node[9];
}
public string Encode()
{
    return JsonConvert.SerializeObject(Nodes, Formatting.None);
}

有没有一个优雅的解决方案?

【问题讨论】:

  • [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 将在其 value 为 null 时忽略属性。在您的情况下,Nodes 属性的值是 Node[9] 数组。 Nodes = Nodes.Where(n => n != null).ToArray();Encode() 方法中是否符合您的需求?
  • 当数据在接收端反序列化时,如果没有索引数据,你期望如何重构数据?即Node[4]{Node,null,null,Node} Node[4] {Node,Node,null,null}
  • @vasily.sib 这绝对是一个解决方案,但是我希望序列化程序有一种方法可以跳过空条目。如果没有必要,我宁愿不实例化一个新数组。
  • @EmrahSüngü Node 对象有一个 Index 属性来处理这个问题。
  • @JackMyStack,那么你不需要使用new Node[9]; 使用List 或适合你的东西,例如HashSet,如果你的所有节点都应该是唯一的

标签: c# json.net


【解决方案1】:

最简单的解决方案是在序列化之前过滤数组。您可以在 Encode 方法中执行此操作,而无需实例化新数组:

public string Encode()
{
    return JsonConvert.SerializeObject(Nodes.Where(n => n != null), Formatting.None);
}

小提琴:https://dotnetfiddle.net/dj8lnP

如果您不喜欢这个想法,无论出于何种原因,您都可以使用类似于Excluding specific items in a collection when serializing to JSON 中的自定义JsonConverter 来进行过滤。

【讨论】:

    猜你喜欢
    • 2016-11-28
    • 2020-11-06
    • 1970-01-01
    • 2013-02-17
    • 2017-02-01
    • 2015-10-23
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多