2015-11-02 102 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

相关问题