WedX - журнал о программировании и компьютерных науках

Разбор нескольких возможных ответов Json

Я уже видел здесь ряд вопросов здесь и здесь, но до сих пор не может работать следующим образом.

Для любого из этих ответов, которые находятся в 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
        }
    }
}
05.09.2017

  • Они подобны. только validationErrorType может быть нулевым 05.09.2017
  • Я не понимаю, что вы имеете в виду. Можете ли вы уточнить, пожалуйста? 05.09.2017
  • Свойство validationErrorType является строкой, строка является ссылочным типом и может быть null 05.09.2017
  • Достаточно конкретного класса, содержащего все 3 свойства. validationErrorType иногда может иметь значение null. 05.09.2017
  • Для graphQlSchema попробуйте пометить validationErrorType как обязательное, как показано в spacetelescope.github.io/understanding-json-schema/reference/. Схема Json,NET, кажется, поддерживает это, как показано в документах: newtonsoft.com/ jsonschema/help/html/ 05.09.2017
  • Извините за задержку с ответом, но я был в отпуске до сегодняшнего дня. Я добился прогресса, добавив требуемый атрибут и зациклив JArray в соответствии с ответом Дэвида Куявски. Я обновил вопрос с внесенными изменениями, чтобы оставить одну проблему, связанную с вложенными объектами. 13.09.2017

Ответы:


1

Ваша проблема связана с JArray и JObject. Если вы действительно хотите обработать ex.Message как массив, вам нужно пройти через дочерние элементы массива. Кроме того, измените JsonSchema с «массива» на «объект». Следующие работы, как вы описали:

        JArray parsedJObject = JArray.Parse(ex.Message);

        JSchema oldSchema = JSchema.Parse(@"
        {
            'type': 'object',
            'properties': {
                'message': {'type': 'string'},
                'errorType': {'type': 'string'}
            },
            'additionalProperties': false
        }");

        JSchema graphQlSchema = JSchema.Parse(@"
        {
            'type': 'object',
            'properties': {
                'validationErrorType': {'type': 'string'},
                'message': {'type': 'string'},
                'errorType': {'type': 'string'}
            },
            'additionalProperties': false
        }");

        foreach (var item in parsedJObject.Children())
        {
            if (item.IsValid(oldSchema)) // IsValid - 1
            {
                // Do stuff
            }
            else if (item.IsValid(graphQlSchema)) // IsValid - 2
            {
                // Do stuff
            }
        }
05.09.2017
Новые материалы

Как создать диаграмму градиентной кисти с помощью D3.js
Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


Для любых предложений по сайту: [email protected]