.Net Core Enum Значения не сериализуются после получения ответа - PullRequest
0 голосов
/ 13 сентября 2018

В базовом решении .Net Web API у меня есть класс (Message) с переменными типа enum, как указано ниже

public enum MessageCode
{
    [EnumMember]
    NULL_PARAMETER,
    BLANK_PARAMETER,
    EMPTY_PARAMETER,
    INVALID_PARAMETER,
    PARAMETER_TRUNCATED,
    QUERY_NOT_FOUND,
    TERM_NOT_FOUND,
    LIST_NOT_FOUND,
    NO_SEARCH_RESULTS,
    NO_UPDATES,
    NO_DICTIONARY,
    NO_PERMISSION,
    LOCKED_PROTOCOL,
    NO_TERMS_IN_LIST,
    DUPLICATE_TERM
}
public enum MessageType
{
    INFO,
    WARNING,
    ERROR,
    FATAL
}
public class Message
{
    [JsonConverter(typeof(StringEnumConverter))]
    public MessageType MessageType { get; set; }

    public bool MessageTypeSpecified;

    [JsonConverter(typeof(StringEnumConverter))]
    public MessageCode MessageCode { get; set; }

    public bool MessageCodeSpecified;

    public string MessageParameters;

    public string MessageText;
}

При получении ответа для объекта (Message) с использованием почтальона ответ былниже

 "messages": [
    {
        "messageTypeSpecified": false,
        "messageCodeSpecified": false,
        "messageParameters": null,
        "messageText": "0"
    }
]

Мне не удалось получить значения enum в ответ.поэтому попробовал следующие варианты

  1. Украсить свойство класса - https://exceptionnotfound.net/serializing-enumerations-in-asp-net-web-api/
  2. Украсить перечисление - https://exceptionnotfound.net/serializing-enumerations-in-asp-net-web-api/
  3. Добавить конвертер глобально - https://exceptionnotfound.net/serializing-enumerations-in-asp-net-web-api/
  4. Упоминание члена перечисления ([EnumMember]) в каждом значении перечисления.

Ничего не получилось.

1 Ответ

0 голосов
/ 13 сентября 2018

Вы случайно попали в функцию Newtonsoft (не очень хорошо задокументировано). Более подробное описание можно найти в этом вопрос .

Вкратце: у вас есть свойство с именем MyPropertyName и свойство с именем MyPropertyNameSpecified, то есть Specified, добавленное к имени другого свойства, по умолчанию для Newtonsoft поведение не заключается в сериализации MyPropertyName, когда MyPropertyNameSpecified равно false.

Решением вашей проблемы будет либо переименование некоторых свойств, либо использование этих настроек:

new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver { IgnoreIsSpecifiedMembers = true }
};

Для редактирования параметров сериализатора JSON в проекте .NET Core укажите параметры в методе ConfigureServies:

services.AddMvc()
    .AddJsonOptions(
        options =>
        {
            options.SerializerSettings.ContractResolver =
                new DefaultContractResolver { IgnoreIsSpecifiedMembers = true };
        });
...