2015-11-02 131 views
0

我確信某處有一個簡單的答案來回答我的問題,但我無法找到它。我面臨的問題是下面,我有一些代碼結構:序列化/反序列化扁平結構中的嵌套對象

class Field 
{ 
    List<Block> Blocks {get;set;} 

    public static Field CreateField() 
    { 
     var A = new Block {Connector = new Connector()} 
     var B = new Block {Connector = new Connector()} 

     A.Connector.ConnectedTo.Add(B); 
     B.Connector.ConnectedTo.Add(A); 

     var field = new Field(); 
     field.Blocks = new List {A, B}; 

     return field; 
    } 
} 

class Block 
{ 
    Connector Connector {get;set;} 
} 

class Connector 
{ 
    List<Block> ConnectedTo {get;set;} 
} 

比系列化命令使用json.net:

JsonConvert.SerializeObject(Field.CreateField(), Formatting.Indented, new JsonSerializerSettings {PreserveReferencesHandling = PreserveReferencesHandling.Objects}); 

,並輸出結果不出所料:

{ 
    "$id": "1", 
    "Blocks": [ 
     { 
      "$id": "2", 
      "Connector": { 
       "$id": "3", 
       "ConnectedTo": [ 
        { 
         "$id": "4", 
         "Connector":{ 
          "$id": "5", 
          "ConnectedTo": [ 
           { 
            "$ref": "2" 
           } 
          ] 
         } 
        } 
       ] 
      } 
     } 
    ] 
} 

有任何方式有序列化結果如下:

{ 
    "$id": "1", 
    "Blocks": [ 
     { 
      "$id": "2", 
      "Connector": { 
       "$id": "3", 
       "ConnectedTo": [ 
        { 
         "$ref": "4" 
        } 
       ] 
      } 
     }, 
     { 
      "$id": "4", 
      "Connector":{ 
       "$id": "5", 
       "ConnectedTo": [ 
        { 
         "$ref": "2" 
        } 
       ] 
      } 
     } 
    ] 
} 

謝謝。

+0

爲什麼你需要它扁平化?看看你如何使用循環引用序列化數據:http://johnnycode.com/2012/04/10/serializing-circular-references-with-json-net-and-entity-framework/ – Kvam

+0

Kvam,謝謝爲迴應。起初,我需要它是人類友好的(用戶應該能夠打開json文件並修改它),現在幾乎不可能在何處以及如何從它開始。然後用10-20塊輸出文件看起來幾乎不可能使用json路徑修改,特別是當我們需要替換某些東西(版本升級過程)時。 – Anton

回答

0

號在第二個例子中,$ref : 4指向發生在JSON以後一個$id。 Json.Net將無法反序列化 - 當它出現在$ref時,它預計能夠將其解析爲它已經看到的$id

我會建議不要求用戶直接修改JSON,除非他們在技術上精通。正如我在回答許多與JSON有關的問題時所看到的那樣,如果您手動編輯它,很容易弄亂格式 - 缺少引號或逗號,不匹配的大括號,無效的語法,您將其命名。當有人把它搞砸時你會做什麼?我認爲一個更好的選擇是製作一個允許抽象地操縱你的結構的工具。該工具可以對原始JSON進行反序列化,允許進行某些更改,然後將其重新串行化爲新結構。用戶不需要通過這種方式瞭解底層JSON格式的任何內容。

+0

謝謝,這正是我的想法。 – Anton

+0

我同意允許用戶修改json文件不是一個好主意,但這就是客戶想要的,我們仍然在爭論。工具(或其他)的問題如下:我們必須保持所有原始模型正確地反序列化json文件,當我們將資產從v1升級到v3時,很容易想象我們將不得不保留多少垃圾。另一個想法是與動態結構一起工作,但我不確定它會是多麼容易或困難, – Anton