我确信在某个地方我的问题有一个简单的答案,但我无法完成它。我遇到的问题是,我有代码结构:
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 :(得分:0)
没有。在第二个示例中,$ref : 4
指向JSON中以后发生的$id
。 Json.Net将无法对此进行反序列化 - 当它出现$ref
时,它希望能够将其解析为它已经看到的$id
。
我建议不要求用户直接修改JSON,除非他们技术精湛。正如我在SO上回答许多与JSON相关的问题时所看到的那样,如果您手动编辑它,很容易弄乱格式 - 缺少引号或逗号,不匹配的括号,无效的语法,您可以命名。有人搞砸了你会怎么做?我认为更好的选择是制作一个允许抽象地操纵结构的工具。该工具可以反序列化原始JSON,允许某些更改,然后将其重新序列化为新结构。用户无需了解任何有关底层JSON格式的信息。