在平面结构中序列化/反序列化嵌套对象

时间:2015-11-02 11:31:12

标签: c# json serialization json.net

我确信在某个地方我的问题有一个简单的答案,但我无法完成它。我遇到的问题是,我有代码结构:

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"
                    }
                ]
            }
        }
    ]
}

感谢。

1 个答案:

答案 0 :(得分:0)

没有。在第二个示例中,$ref : 4指向JSON中以后发生的$id。 Json.Net将无法对此进行反序列化 - 当它出现$ref时,它希望能够将其解析为它已经看到的$id

我建议不要求用户直接修改JSON,除非他们技术精湛。正如我在SO上回答许多与JSON相关的问题时所看到的那样,如果您手动编辑它,很容易弄乱格式 - 缺少引号或逗号,不匹配的括号,无效的语法,您可以命名。有人搞砸了你会怎么做?我认为更好的选择是制作一个允许抽象地操纵结构的工具。该工具可以反序列化原始JSON,允许某些更改,然后将其重新序列化为新结构。用户无需了解任何有关底层JSON格式的信息。