Десериализация 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, и сериализация \ десериализация будет идти так, как я хотел.