序列化/反序列化扁平结构中的嵌套对象
问题描述:
我确信某处有一个简单的答案来回答我的问题,但我无法找到它。我面临的问题是下面,我有一些代码结构:序列化/反序列化扁平结构中的嵌套对象
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"
}
]
}
}
]
}
谢谢。
答
号在第二个例子中,$ref : 4
指向发生在JSON以后一个$id
。 Json.Net将无法反序列化 - 当它出现在$ref
时,它预计能够将其解析为它已经看到的$id
。
我会建议不要求用户直接修改JSON,除非他们在技术上精通。正如我在回答许多与JSON有关的问题时所看到的那样,如果您手动编辑它,很容易弄乱格式 - 缺少引号或逗号,不匹配的大括号,无效的语法,您将其命名。当有人把它搞砸时你会做什么?我认为一个更好的选择是制作一个允许抽象地操纵你的结构的工具。该工具可以对原始JSON进行反序列化,允许进行某些更改,然后将其重新串行化为新结构。用户不需要通过这种方式了解底层JSON格式的任何内容。
为什么你需要它扁平化?看看你如何使用循环引用序列化数据:http://johnnycode.com/2012/04/10/serializing-circular-references-with-json-net-and-entity-framework/ – Kvam
Kvam,谢谢为回应。起初,我需要它是人类友好的(用户应该能够打开json文件并修改它),现在几乎不可能在何处以及如何从它开始。然后用10-20块输出文件看起来几乎不可能使用json路径修改,特别是当我们需要替换某些东西(版本升级过程)时。 – Anton