Я уже видел здесь ряд вопросов здесь и здесь, но до сих пор не может работать следующим образом.
Для любого из этих ответов, которые находятся в ex.Message:
Ответ 1
[
{
"validationErrorType": "WrongType",
"message": "Validation error of type WrongType",
"errorType": "ValidationError"
}
]
Ответ 2
[
{
"message": "Validation error of type WrongType:",
"errorType": "ValidationError"
}
]
Я пытаюсь динамически проанализировать это следующим образом:
JArray parsedJObject = JArray.Parse(ex.Message);
JSchema oldSchema = JSchema.Parse(@"
{
'type': 'array',
'properties': {
'message': {'type': 'string'},
'errorType': {'type': 'string'}
},
'additionalProperties': false
}");
JSchema graphQlSchema = JSchema.Parse(@"
{
'type': 'array',
'properties': {
'validationErrorType': {'type': 'string'},
'message': {'type': 'string'},
'errorType': {'type': 'string'}
},
'additionalProperties': false
}");
if (parsedJObject.IsValid(oldSchema)) // IsValid - 1
{
// Do stuff
}
else if (parsedJObject.IsValid(graphQlSchema)) // IsValid - 2
{
// Do stuff
}
Однако оба вызова IsValid() возвращают true для любого ответа. Что я здесь делаю неправильно?
Для ответа 1 я ожидаю, что IsValid - 1
вернет true
, а IsValid - 2
вернет false
.
И для ответа 2 я ожидаю, что IsValid - 1
вернет false
, а IsValid - 2
вернет true
.
Обновить
Следуя предложениям Дэвида Куявски и dbc для циклического просмотра JArray и добавления атрибута required
. Я добился прогресса.
Мой обновленный код приведен ниже, но все еще пытается проверить схему с вложенным объектом locations
.
Ответ
[
{
"validationErrorType": "WrongType",
"locations": [
{
"line": 4,
"column": 1
}
],
"message": "Validation error of type WrongType",
"errorType": "ValidationError"
}
]
Определение схемы:
JSchema graphQlSchema = JSchema.Parse(@"
{
'type': 'object',
'properties':
{
'validationErrorType': {'type': 'string'},
'locations':
{
'type': 'object',
'properties':
{
'line': {'type': 'string'},
'column': {'type': 'string'}
}
},
'message': {'type': 'string'},
'errorType': {'type': 'string'}
},
'additionalProperties': false,
'required': ['message', 'errorType', 'validationErrorType', 'locations']
}");
Анализ ответа
JArray parsedJObject = JArray.Parse(ex.Message);
foreach (JToken child in parsedJObject.Children())
{
if (child.IsValid(graphQlSchema)) // Not resolving to true
{
var graphQlSchemaDef = new[]
{
new
{
validationErrorType = string.Empty,
locations = new
{
line = string.Empty,
column = string.Empty
},
message = string.Empty,
errorType = string.Empty
}
};
var exceptionMessages = JsonConvert.DeserializeAnonymousType(ex.Message, graphQlSchemaDef);
foreach (var message in exceptionMessages)
{
// Do stuff
}
}
}