2017-02-10 13 views
2

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

Итак, у меня есть json-схема, и я использовал 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, но он не может распознать значение перечисления с пространство с ошибкой, как это:

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

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

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

С уважением, Kanstantsin.

+0

Можете ли вы поделиться источником для метода 'Some.FromJson (json);'? Основной сериализатор должен быть Json.NET, который поддерживает [de] сериализацию перечислений как строки, если используется ['StringEnumConverter'] (http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Converters_StringEnumConverter.htm). – dbc

+0

Да, вы так правы. Дело в том, что метод был сгенерирован, и я не смог найти подходящий способ добраться до этого конвертера.Я, но решение в ответ, я случайно нашел его сам. – kikaxa

ответ

2

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

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

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

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

+0

Просто оповещение: NJS также поддерживает свойство x-enumNames, чтобы вы могли управлять именем и значением сгенерированных перечислений –

 Смежные вопросы

  • Нет связанных вопросов^_^