c# - Newtonsoft - 自定义排序IEnumerable属性 - JSON

时间:2016-03-28 07:31:00

标签: c# .net json json.net

考虑Node类。使用Newtonsoft将其转换为JSON。

class Node {
   IList<Node> Nodes { get; }
}

我目前正在将默认排序逻辑实现为 -

class Node : IComparable<Node> {
   IList<Node> Nodes { get; }

   public int CompareTo(Node node) {
      // some default sorting logic
   }
}

Newtonsoft,在使用它进行序列化时,给JSON提供了以相同逻辑排序的节点。

string jsonString = JsonConvert.SerializeObject(
   deserializedObject, 
   Formatting.None, 
   new JsonSerializerSettings
   {
            // some settings
   });

问题:现在,我想将IComparer传递给JsonConvert.SerializeObject()方法,以便JSON在新的排序逻辑中具有Nodes集合。

在某种程度上,我想让调用者自由地按照他们的方式对集合进行排序,而不是默认的集合,否则将使用它。

不知道是否有一种简单的方法可以做到这一点?有什么建议吗?

1 个答案:

答案 0 :(得分:2)

无法将IComparer传递给JsonConvert.SerializeObject()。您可以使用自定义排序(IComparer)逻辑对对象列表进行排序,并将列表传递给序列化。

但是,正如您所说,您可以将IComparer传递给Custom方法并完成任务。如下,

class Node
    {
        IList<Node> Nodes { get; set; }
        internal string Serialize(IComparer<Node> comparer)
        {
            Nodes = (IList<Node>)Nodes.OrderBy(c => c, comparer);
            return JsonConvert.SerializeObject(Nodes, Formatting.Indented, new JsonSerializerSettings() { });
        }
    }
    class SortHelper : IComparer<Node>
    {
        int IComparer<Node>.Compare(Node x, Node y)
        {
            // compare object x and y by custom logic
            return 0;
        }
    }

并使用上述自定义IComparer

调用以下方法
string jsonString = node.Serialize(new SortHelper());