2016-03-28 41 views
0

考慮類Node。使用Newtonsoft將其轉換爲JSON。c# - Newtonsoft - 自定義排序IEnumerable屬性 - 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應該有節點集合中的一個新的排序邏輯。

以某種方式,我想讓調用者自由地按照他們的方式對集合進行排序,而不是默認的集合,否則將會使用這種集合。

不知道是否有一個簡單的方法呢?有什麼建議嗎?

+0

可以提供自由,一旦你反序列化對象,用戶可以使用自定義的IComparer重新安排項目在列表中 –

+0

以某種方式,我想在獲取JSON時執行此操作。這是非常大的JSON(〜75 MB),我們不想涉及反序列化成本,並再次序列化,因爲最終用戶需要JSON。 – Prakhar

+0

然後,在對象序列化爲Json之前,您需要一個自定義排序機制,以此作爲用戶輸入,轉換爲自定義DS,進行比較和重新排序,然後再發送序列化的Json數據 –

回答

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; 
     } 
    } 

,並呼籲上述writter定製的IComparer以下方法

string jsonString = node.Serialize(new SortHelper()); 
+0

不是IComparer,而是用戶輸入在自定義數據結構中,可以將其轉換爲與IComparer類似的內容,以便在序列化之前進行處理 –

+0

這確實是一個很好的示例+1,其中IComparer 用於實現此目的,並且Custom Comparer可以通過用戶輸入和提供到排序功能。爲了更清楚地檢查IComparer和IComparable之間的區別,請參閱http://stackoverflow.com/questions/5980780/difference-between-icomparable-and-icomparer –