.Net Core Enum值在获得响应后未进行序列化

问题描述 投票:1回答:1

在.Net Web API核心解决方案中,我有一个类(消息),其中包含枚举类型的变量,如下所述

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;
}

在使用邮递员获取对象(消息)的响应时,响应如下

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

我无法得到枚举值作为回应。所以尝试了以下选项

  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])。

什么都没有成功。

c# .net enums .net-core asp.net-core-webapi
1个回答
2
投票

你不小心碰到了一个N​​ewtonsoft功能(没有很好的记录)。在这个question中可以找到更长的描述。

简而言之:你有一个名为MyPropertyName的属性和一个名为MyPropertyNameSpecified的属性,即Specified附加到其他属性名称,Newtonsoft的默认行为是当MyPropertyNameMyPropertyNameSpecified时不序列化false

您的问题的解决方案是重命名某些属性或使用这些设置:

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

要在.NET Core项目中编辑JSON序列化程序设置,请提供ConfigureServies方法中的选项:

services.AddMvc()
    .AddJsonOptions(
        options =>
        {
            options.SerializerSettings.ContractResolver =
                new DefaultContractResolver { IgnoreIsSpecifiedMembers = true };
        });
© www.soinside.com 2019 - 2024. All rights reserved.