C# 从JSON子对象创建父对象
我有如下JSON子级/树表示:C# 从JSON子对象创建父对象,c#,json.net,C#,Json.net,我有如下JSON子级/树表示: { "someObj": { "test": 10 }, "children": [ { "someObj": { "test": 11 }, "children": [ {
{
"someObj":
{
"test": 10
},
"children":
[
{
"someObj":
{
"test": 11
},
"children":
[
{
"someObj":
{
"test": 12,
"children": null
}
}
]
},
{
"someObj":
{
"test": 12
},
"children":
[
{
"someObj":
{
"test": 13,
"children": null
}
}
]
}
]
}
public class Example
{
public Dictionary<string, object> SomeObj { get; set; }
public IList<Example> Children { get; set; }
//Extended with Parent prop
public Example Parent { get; set; }
[OnDeserialized]
protected void OnDeserializedMethod(StreamingContext context)
{
RegisterParentRecursive(this);
}
public void RegisterParentRecursive(Example parent)
{
foreach (var child in parent.Children)
{
child.Parent = parent;
RegisterParentRecursive(child);
}
}
}
我正在将其反序列化为C#类表示:
public class Example
{
public Dictionary<string, object> SomeObj { get; set; }
public IList<Example> Children { get; set; }
//Extended with Parent prop
public Example Parent { get; set; }
}
公共类示例
{
公共字典SomeObj{get;set;}
公共IList子项{get;set;}
//用父道具扩展
公共示例父项{get;set;}
}
我想做的是使用父属性扩展我的模型类示例
Parent
应包含有关“previous”子对象的所有信息-例如:someObj:{“test”:11}
知道其父对象是“someObj”:{“test”:10}
我应该写一些JsonConverter来实现这一点吗?或者在反序列化之后做一些方法,在所有嵌套(子项)之后循环对象并创建它们的父对象?据我所知,设置JSON转换来实现这一点并不容易。您可以使用自己的转换器来实现这一点,但这可能会给表带来额外的复杂性,使其不值得付出所需的努力
或者,您可以对结构进行后期处理。由于您已经定义了层次结构(通过子级),现在也可以通过遍历层次结构来引用父级
这可以通过一个相当简单的递归方法来实现:
public void RegisterParentRecursive(Example parent)
{
foreach(var child in parent.Children)
{
child.Parent = parent;
RegisterParentRecursive(child);
}
}
您只需将其称为顶级家长:
Example topLevelParent = ParseMyJSON();
RegisterParentRecursive(topLevelParent);
由于这是一个内存中的进程,因此不会影响性能
另外,对于使遍历变得不那么简单的足够大的结构,我希望您首先会遇到其他问题(JSON字符串大小、反序列化性能等等),因此后处理本身并不是最大的瓶颈。据我所知,设置JSON转换来实现这一点并不容易。您可以使用自己的转换器来实现这一点,但这可能会给表带来额外的复杂性,使其不值得付出所需的努力
或者,您可以对结构进行后期处理。由于您已经定义了层次结构(通过子级),现在也可以通过遍历层次结构来引用父级
这可以通过一个相当简单的递归方法来实现:
public void RegisterParentRecursive(Example parent)
{
foreach(var child in parent.Children)
{
child.Parent = parent;
RegisterParentRecursive(child);
}
}
您只需将其称为顶级家长:
Example topLevelParent = ParseMyJSON();
RegisterParentRecursive(topLevelParent);
由于这是一个内存中的进程,因此不会影响性能
另外,对于使遍历变得不那么简单的足够大的结构,我希望您首先会遇到其他问题(JSON字符串大小、反序列化性能等等),因此不会真正使后期处理本身成为最大的瓶颈。使用json转换事件很方便-您的后期处理将自动启动。
大概是这样的:
{
"someObj":
{
"test": 10
},
"children":
[
{
"someObj":
{
"test": 11
},
"children":
[
{
"someObj":
{
"test": 12,
"children": null
}
}
]
},
{
"someObj":
{
"test": 12
},
"children":
[
{
"someObj":
{
"test": 13,
"children": null
}
}
]
}
]
}
public class Example
{
public Dictionary<string, object> SomeObj { get; set; }
public IList<Example> Children { get; set; }
//Extended with Parent prop
public Example Parent { get; set; }
[OnDeserialized]
protected void OnDeserializedMethod(StreamingContext context)
{
RegisterParentRecursive(this);
}
public void RegisterParentRecursive(Example parent)
{
foreach (var child in parent.Children)
{
child.Parent = parent;
RegisterParentRecursive(child);
}
}
}
公共类示例
{
公共字典SomeObj{get;set;}
公共IList子项{get;set;}
//用父道具扩展
公共示例父项{get;set;}
[已序列化]
受保护的void OnDeserializedMethod(StreamingContext上下文)
{
注册方草书(本);
}
公共无效注册表父级草书(示例父级)
{
foreach(parent.Children中的变量child)
{
child.Parent=Parent;
注册家长草书(儿童);
}
}
}
使用json转换事件很方便-您的后期处理将自动启动。
大概是这样的:
{
"someObj":
{
"test": 10
},
"children":
[
{
"someObj":
{
"test": 11
},
"children":
[
{
"someObj":
{
"test": 12,
"children": null
}
}
]
},
{
"someObj":
{
"test": 12
},
"children":
[
{
"someObj":
{
"test": 13,
"children": null
}
}
]
}
]
}
public class Example
{
public Dictionary<string, object> SomeObj { get; set; }
public IList<Example> Children { get; set; }
//Extended with Parent prop
public Example Parent { get; set; }
[OnDeserialized]
protected void OnDeserializedMethod(StreamingContext context)
{
RegisterParentRecursive(this);
}
public void RegisterParentRecursive(Example parent)
{
foreach (var child in parent.Children)
{
child.Parent = parent;
RegisterParentRecursive(child);
}
}
}
公共类示例
{
公共字典SomeObj{get;set;}
公共IList子项{get;set;}
//用父道具扩展
公共示例父项{get;set;}
[已序列化]
受保护的void OnDeserializedMethod(StreamingContext上下文)
{
注册方草书(本);
}
公共无效注册表父级草书(示例父级)
{
foreach(parent.Children中的变量child)
{
child.Parent=Parent;
注册家长草书(儿童);
}
}
}
这是一个很好的答案,解决了我的问题。非常感谢。我知道我可以面对其他问题,但现在不是这样。JSON/应用程序将非常小,而且不以“性能”为导向这是一个很好的回答,解决了我的问题。谢谢。我知道我可以面对其他问题,但现在不是这样。JSON/应用程序将非常小,而且不以性能为导向。