Обработка перечислений в теле запроса на публикацию - PullRequest
0 голосов
/ 05 мая 2020

Я создаю ASP. NET Core Web API.

Мне нужно тело сообщения, например:

{
"Name": "XYX",
"Status":"Waiting"
}

Статус - это Enum:

public enum Status
{
    [Description("Waiting")]
    Waiting = 1,
    [Description("Occuring")]
    Occuring = 2,
    [Description("Stopping")]
    Stopping = 3,
}

Что мне делать, чтобы не получить сообщение об ошибке:

The JSON value could not be converted to PostgreSql.Enums.StatusEnum. Path:

PS: Пробовал то, что упоминалось здесь , но у меня это не сработало.

Ответы [ 3 ]

1 голос
/ 05 мая 2020

ASP. NET дюйм NET Core 3.0 удалена зависимость JSON. NET (Newtonsoft. Json) (используется в ссылке, которую вы предоставлено), поэтому попробуйте использовать атрибуты System.Text. Json: JsonStringEnumConverter и JsonConverterAttribute .

UPD Не удалось воспроизвести проблема, которую вы упомянули в комментарии:

class MyClass
{    
    [JsonConverter(typeof(JsonStringEnumConverter))]
    public Status MyProperty { get; set; }

    [JsonConverter(typeof(JsonStringEnumConverter))]
    public Status MyProperty1 { get; set; }
}

var serialized = JsonSerializer.Serialize(new MyClass
{
    MyProperty = Status.Waiting,
    MyProperty1 = Status.Occuring
}); // results in string containing {"MyProperty":"Waiting","MyProperty1":"Occuring"}

var result = JsonSerializer.Deserialize<MyClass>(serialized); // all properties set

Также обратите внимание, что имя значения Status используется для сериализации / десериализации, а не значение атрибута Description.

0 голосов
/ 05 мая 2020

Вы можете создать перечисление следующим образом:

[JsonConverter(typeof(StringEnumConverter))]
public enum Status : byte
{
    Waiting = 1,
    Occuring = 2,
    Stopping = 3
}

и передать строковое значение в теле POST

0 голосов
/ 05 мая 2020

Есть ли причина, по которой вашему телу сообщения передается описание, а не значение перечисления? Если это перечисление является частью схемы / определения API, то все, что потребляет, тоже должно знать об этом, поэтому API может быть вызван с целочисленным значением, например:

{
"Name": "XYX",
"Status":1
}

Я знаю, что это не точное решение для что вы просили, но это альтернатива, и, возможно, стоит подумать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...