我敢肯定,在某个地方,我的问题有一个简单的答案,但我无法找到答案。我遇到的问题如下,我有代码结构:
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
指向一个$id
发生后的JSON。Json.Net将无法反序列化它-当它出现时,$ref
它希望能够将其解决为$id
已经看到的。
我建议不要要求用户直接修改JSON,除非他们在技术上精通。正如我在SO上回答许多与JSON相关的问题所看到的那样,如果手动编辑格式,很容易弄乱格式-缺少引号或逗号,大括号不匹配,语法无效,都可以将其命名。当有人将其拧紧时,您将怎么办?我认为一个更好的选择是制作一个可以抽象地处理您的结构的工具。该工具可以反序列化原始JSON,允许进行某些更改,然后将其重新序列化为新结构。这样,用户将不需要了解有关底层JSON格式的任何信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句