Проверка необработанного Json по схеме Json, сгенерированной из интерфейсов C#

Я использую NJsonSchema для проверки необработанных строк Json по схеме Json, сгенерированной из типа.Net. Тип.Net - это интерфейс, содержащий дочернее свойство, которое также является интерфейсом.

Вот основной интерфейс (IPersonDataContract):

public interface IPersonDataContract
{
    Int32 PersonId { get; set; }
    String FirstName { get; set; }
    String LastName { get; set; }
    String Name { get; set; }
    DateTime? Birthday { get; set; }
    Int32 Age { get; }
    IEnumerable<IPhoneNumberDataContract> PhoneNumberList { get; set; }
}

Вот интерфейс, описывающий свойство PhoneNumberList:

public interface IPhoneNumberDataContract
{
    Int32 PhoneNumberTypeId { get; set; }
    String PhoneNumberTypeName { get; set; }
    String PhoneNumber { get; set; }
}

Я использую NJsonSchema для проверки необработанного Json по отношению к JsonSchema, сгенерированному из IPersonDataContract. Я получаю ошибки проверки, потому что PhoneNumberList определен как интерфейс (IEnumerable из IPhoneNumberDataContract). Если я изменю определение PhoneNumberList на конкретный класс (IEnumerable of PhoneNumberDataContract), то при проверке ошибок не будет.

Вот схема Json, сгенерированная из IPersonDataContract с IPhoneDataContract:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "IListOfPersonDataContract",
    "type": "array",
    "items": {
        "$ref": "#/definitions/PersonDataContract"
    },
    "definitions": {
        "PersonDataContract": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                //removed for brevity
            }
        },
        "IPhoneNumberDataContract": {
            "type": "object",
            "additionalProperties": false
        }
    }
}

Вот схема Json, сгенерированная из IPersonDataContract с PhoneDataContract (конкретный класс):

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "IListOfPersonDataContract",
    "type": "array",
    "items": {
        "$ref": "#/definitions/PersonDataContract"
    },
    "definitions": {
        "PersonDataContract": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                //removed for brevity
            }
        },
        "PhoneNumberDataContract": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "PhoneNumberTypeId": {
                    "type": "integer",
                    "format": "int32"
                },
                "PhoneNumberTypeName": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "PhoneNumber": {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            }
        }
    }
}

Разница заключается в том, что схема Json, построенная из конкретного класса (PhoneNumberDataContract), включает в себя дополнительные свойства, тогда как схема Json из интерфейса исключает дополнительные свойства. Мой необработанный Json проверяется при использовании схемы Json на основе конкретного класса.

Я не понимаю, почему это происходит, потому что интерфейс включает в себя необходимые определения свойств. Как заставить Json Schema включать свойства при работе с интерфейсами? Мне кажется, что поскольку интерфейсы описывают то, что содержит конкретный класс, то схема Json, сгенерированная из интерфейса, должна легко включать свойства интерфейса, поскольку конкретный класс, основанный на интерфейсе, должен реализовывать сигнатуру интерфейса.

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

Спасибо за вашу помощь.

0 ответов

Другие вопросы по тегам