繁体   English   中英

如何以递归方式在对象子级列表中找到所有对象?

[英]How can I find all of objects in a list of an object's child recursively?

我有一个需要处理的对象。 此对象的类型为SchemaValidationResults ,其中包含列表List<SchemaValidationResults> NestedResults ,该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;
        }

这种方法很有效,它产生的对象列表中没有任何子对象,但是我所期望的10个对象中,只有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
          }
        }
      ]
    }
  ]
}

您的一个循环太多。

这是您代码的修订版:

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM