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

c#-Newtonsoft-自定义排序IEnumerable属性-JSON,c#,.net,json,json.net,C#,.net,Json,Json.net,考虑节点类。使用Newtonsoft将其转换为JSON class Node { IList<Node> Nodes { get; } } 问题:现在,我想将类似于IComparer的内容传递给JsonConvert.SerializeObject()方法,以便JSON应该在新的排序逻辑中具有节点集合 在某种程度上,我想让调用者自由地按照自己的方式对集合进行排序,而不是默认的方式,否则将使用默认方式 不知道有没有简单的方法?有什么建议吗?无法将IComparer传递给Json

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

class Node {
   IList<Node> Nodes { get; }
}
问题:现在,我想将类似于
IComparer
的内容传递给
JsonConvert.SerializeObject()
方法,以便JSON应该在新的排序逻辑中具有节点集合

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


不知道有没有简单的方法?有什么建议吗?

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

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

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传递给JsonConvert.SerializeObject()。您可以使用自定义排序(IComparer)逻辑对对象列表进行排序,并将列表传递给序列化

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

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以某种方式重新排列列表中的项目,我希望在获取JSON的同时这样做。这是一个非常大的JSON(~75MB),我们不想涉及反序列化成本,也不想再次序列化,因为最终消费者需要JSON。然后,在对象序列化为JSON之前,您需要一个自定义排序机制,将其作为用户输入,转换为自定义DS,进行比较和重新排列,在序列化的Json数据发送之前,您可以提供这种自由一旦您对对象进行反序列化,用户就可以使用自定义的IComparer以某种方式重新排列列表中的项目,我希望在获取Json的同时这样做。这是一个非常大的JSON(~75MB),我们不想涉及反序列化成本,也不想再次序列化,因为最终消费者需要JSON。然后,在对象序列化为JSON之前,您需要一个自定义排序机制,将其作为用户输入,转换为自定义DS,进行比较和重新排列,在序列化Json数据发送之前,不是作为IComparer,而是作为自定义数据结构中的用户输入,可以将其转换为类似于IComparer的内容,以便在序列化之前进行处理。这确实是一个很好的示例+1,其中IComparer用于实现此目的,自定义比较器可以通过用户输入实现,并提供给排序功能。为更清楚起见,还应检查IComparer和IComparable之间的差异,不是作为IComparer,而是作为自定义数据结构中的用户输入,可以将其转换为类似于IComparer的内容,以便在序列化之前进行处理。这确实是一个很好的示例+1,其中IComparer用于实现此目的,自定义比较器可以通过用户输入实现,并提供给排序功能。为了更清楚,请检查IComparer和IComparable之间的差异
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;
        }
    }
string jsonString = node.Serialize(new SortHelper());