如何以递归方式查找对象子项列表中的所有对象?

问题描述 投票:0回答:1

我有一个我需要处理的对象。此对象的类型为SchemaValidationResults,其中包含一个列表List<SchemaValidationResults> NestedResults,其中可能包含或不包含其他SchemaValidationResults对象。

为了更清楚,我在下面提供了一个JSON表示。在此JSON表示中是父对象,其包含具有两个子对象的子对象。其中一个子对象具有另一个子对象。

所以我们有:

Parent
     Child
          Child
          Child
               Child

我需要能够检索此JSON表示中没有任何其他子节点的对象。在上述结构中,我需要这两个孩子。

Parent
     Child
          Child <-- Need
          Child
               Child <- Need

JSON

{
  "valid": false,
  "keywordLocation": "#/properties/form_submission/properties/sections/properties",
  "instanceLocation": "#/form_submission/sections",
  "keyword": "properties",
  "errors": [
    {
      "valid": false,
      "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions",
      "instanceLocation": "#/form_submission/sections/6/questions",
      "errors": [
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/properties/102/$ref/properties/answer/type",
          "instanceLocation": "#/form_submission/sections/6/questions/102/answer",
          "keyword": "type",
          "additionalInfo": {
            "expected": "string",
            "actual": "number"
          }
        },
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf",
          "instanceLocation": "#/form_submission/sections/6/questions",
          "keyword": "allOf",
          "errors": [
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf/0/else/properties/100/properties/answer/maxLength",
              "instanceLocation": "#/form_submission/sections/6/questions/100/answer",
              "keyword": "maxLength",
              "additionalInfo": {
                "expected": 0,
                "actual": 2
              }
            }
          ]
        }
      ]
    }
  ]
}

这种性质使我相信递归将能够帮助我创建一个没有更多孩子的所有子对象的列表。

但是我开始写一个方法,我很快意识到我不确定如何构造方法来实现我想要的结果。到目前为止我有这个:

public List<SchemaValidationResults> GetChildLessError(SchemaValidationResults errors)
        {
            List<SchemaValidationResults> childLessErrors = new List<SchemaValidationResults>();

            foreach(var result in errors.NestedResults)
            {
                if(result.NestedResults.Count == 0)
                {
                    childLessErrors.Add(result);
                }
                else
                {
                    foreach(var resultChild in result.NestedResults)
                    childLessErrors.AddRange(GetChildLessError(resultChild));
                }
            }

            return childLessErrors;
        }

这种方法很有效,它会生成一个没有任何子节点的对象列表,但是我预计它只会产生6个对象。

下面是我正在运行此方法的完整JSON文件。第一个JSON文件只是一个片段。

{
  "valid": false,
  "keywordLocation": "#/properties/form_submission/properties/sections/properties",
  "instanceLocation": "#/form_submission/sections",
  "keyword": "properties",
  "errors": [
    {
      "valid": false,
      "keywordLocation": "#/properties/form_submission/properties/sections/properties/1/properties/questions/properties/3/$ref/properties/answer/enum",
      "instanceLocation": "#/form_submission/sections/1/questions/3/answer",
      "keyword": "enum"
    },
    {
      "valid": false,
      "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions",
      "instanceLocation": "#/form_submission/sections/6/questions",
      "errors": [
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/properties/102/$ref/properties/answer/type",
          "instanceLocation": "#/form_submission/sections/6/questions/102/answer",
          "keyword": "type",
          "additionalInfo": {
            "expected": "string",
            "actual": "number"
          }
        },
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf",
          "instanceLocation": "#/form_submission/sections/6/questions",
          "keyword": "allOf",
          "errors": [
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf/0/else/properties/100/properties/answer/maxLength",
              "instanceLocation": "#/form_submission/sections/6/questions/100/answer",
              "keyword": "maxLength",
              "additionalInfo": {
                "expected": 0,
                "actual": 2
              }
            },
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf/1/else/properties/101/properties/answer/maxLength",
              "instanceLocation": "#/form_submission/sections/6/questions/101/answer",
              "keyword": "maxLength",
              "additionalInfo": {
                "expected": 0,
                "actual": 3
              }
            },
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/6/properties/questions/allOf/4/else/properties/104/properties/answer/maxLength",
              "instanceLocation": "#/form_submission/sections/6/questions/104/answer",
              "keyword": "maxLength",
              "additionalInfo": {
                "expected": 0,
                "actual": 5
              }
            }
          ]
        }
      ]
    },
    {
      "valid": false,
      "keywordLocation": "#/properties/form_submission/properties/sections/properties/8/properties/questions",
      "instanceLocation": "#/form_submission/sections/8/questions",
      "errors": [
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/8/properties/questions/properties/191/$ref/properties/answer",
          "instanceLocation": "#/form_submission/sections/8/questions/191/answer",
          "errors": [
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/8/properties/questions/properties/191/$ref/properties/answer/minLength",
              "instanceLocation": "#/form_submission/sections/8/questions/191/answer",
              "keyword": "minLength",
              "additionalInfo": {
                "expected": 1,
                "actual": 0
              }
            },
            {
              "valid": false,
              "keywordLocation": "#/properties/form_submission/properties/sections/properties/8/properties/questions/properties/191/$ref/properties/answer/enum",
              "instanceLocation": "#/form_submission/sections/8/questions/191/answer",
              "keyword": "enum"
            }
          ]
        },
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/8/properties/questions/allOf/12/else/properties/191/properties/answer/enum",
          "instanceLocation": "#/form_submission/sections/8/questions/191/answer",
          "keyword": "enum"
        }
      ]
    },
    {
      "valid": false,
      "keywordLocation": "#/properties/form_submission/properties/sections/properties/9/properties/questions/allOf",
      "instanceLocation": "#/form_submission/sections/9/questions",
      "keyword": "allOf",
      "errors": [
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/9/properties/questions/allOf/0/else/properties/211/properties/answer/maxLength",
          "instanceLocation": "#/form_submission/sections/9/questions/211/answer",
          "keyword": "maxLength",
          "additionalInfo": {
            "expected": 0,
            "actual": 12
          }
        },
        {
          "valid": false,
          "keywordLocation": "#/properties/form_submission/properties/sections/properties/9/properties/questions/allOf/1/else/properties/240/properties/answer/maxLength",
          "instanceLocation": "#/form_submission/sections/9/questions/240/answer",
          "keyword": "maxLength",
          "additionalInfo": {
            "expected": 0,
            "actual": 4
          }
        }
      ]
    }
  ]
}
c# json recursion
1个回答
2
投票

你有一个循环太多了。

这是您的代码的修订版本:

public List<SchemaValidationResults> GetChildLessError(SchemaValidationResults errors)
{
    List<SchemaValidationResults> childLessErrors = new List<SchemaValidationResults>();

    if(errors.NestedResults.Any())
    {
        foreach(var resultChild in errors.NestedResults)
        {
            childLessErrors.AddRange(GetChildLessError(resultChild));
        }
    }
    else
    {
        childLessErrors.Add(errors);                    
    }
    return childLessErrors;
}
© www.soinside.com 2019 - 2024. All rights reserved.