Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从JSON子对象创建父对象_C#_Json.net - Fatal编程技术网

C# 从JSON子对象创建父对象

C# 从JSON子对象创建父对象,c#,json.net,C#,Json.net,我有如下JSON子级/树表示: { "someObj": { "test": 10 }, "children": [ { "someObj": { "test": 11 }, "children": [ {

我有如下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);
        }
    }

}
我正在将其反序列化为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/应用程序将非常小,而且不以性能为导向。