我有一个我需要处理的对象。此对象的类型为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
}
}
]
}
]
}
你有一个循环太多了。
这是您的代码的修订版本:
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;
}