Десериализация Json в NJsonSchema порожденный объект с перечислениями, содержащими пробелы

Нужна ваша помощь.

Итак, у меня есть схема JSON, и я использовал инструмент https://www.nuget.org/packages/NJsonSchema.CodeGeneration для создания модели.cs. Я был в состоянии использовать его, чтобы успешно десериализовать json в объект, пока входной json не содержал значения enum с пробелами в нем.

Вот о чем я говорю

В схеме у меня есть свойство как:

...
prop1: {
                enum: [ 'with space', 'withoutspace' ],
            },
...

В сгенерированной модели.cs у меня есть соответствующее перечисление:

[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "7.10.6235.25398")]
    public enum Some_prop1
    {
        [System.Runtime.Serialization.EnumMember(Value = "with space")]
        With_Space = 0,

        [System.Runtime.Serialization.EnumMember(Value = "withoutspace")]
        Withoutspace= 1,
    }

И вот два входных примера: Json 1:

{
    ...
    "prop1": "with space",
    ...
} 

Json 2:

{
    ...
    "prop1": "withoutspace",
    ...
} 

И тогда я просто десериализирую это, когда мне это нужно:

var someModel = Some.FromJson(json);

Он работает так же, как и для Json 2, но не может распознать значение enum с пробелом с такой ошибкой:

"Ошибка преобразования значения \" с пробелом \ "в тип 'com.company.model.Some_prop1'. Путь 'prop1', строка 7, позиция 24".

Итак, вот мой главный вопрос: есть ли способ справиться с такой ситуацией, не меняя формат enum в схеме?

Небольшой дополнительный вопрос: во время исследования я столкнулся с еще одной проблемой - если я собираюсь использовать сериализацию, например some.ToJson(), мои перечисления будут генерироваться таким образом, как "prop1": 0, с использованием int <, и поскольку json используется как удобный для пользователя. Чтобы изменить вещи, мне это нужно так, как "prop1": "с пробелом".

С уважением, Константин.

1 ответ

Решение

Я сам случайно нашел ответ и надеюсь, что он будет полезен и кому-то еще.

Значение по умолчанию для enum - это int, поэтому при десериализации оно пытается получить значение int из enum или точное имя элемента enum. Но вы можете заставить его понимать enum как строку прежде всего:

...
prop1: {
                type: "string",
                enum: [ 'with space', 'withoutspace' ],
            },
...

Поэтому в сгенерированном классе будет использоваться атрибут StringEnumConverter, и сериализация \ десериализация будет идти так, как я хотел.

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