【问题标题】:StringEnumConverter works as an attribute but not globallyStringEnumConverter 作为属性工作,但不是全局的
【发布时间】:2020-10-19 23:20:29
【问题描述】:

我们正在实现一个 .NET Core 3.1 API,我们正在根据this doc 使用 Microsoft.AspNetCore.Mvc.NewtonsoftJson。我们正在处理枚举,我们需要字符串表示而不是整数。我们正在使用这样的 JsonConverter 属性:

[JsonProperty("region")]
[JsonConverter(typeof(StringEnumConverter))]
public Region Region { get; set; }

我们正在尝试从 Startup.cs 全局执行此操作,如下所示:

services.AddControllers().AddNewtonsoftJson(opts => opts.SerializerSettings.Converters.Add(new StringEnumConverter()));

如果我们这样做,Cosmos DB 就会抱怨

“从文档中提取的PartitionKey与标题中指定的不匹配”

所以我们尝试删除除区域一以外的所有属性。没有该属性的所有其他枚举都正确存储为字符串,但该区域仍然需要该属性才能工作。任何线索为什么会发生这种情况以及如何解决它?

【问题讨论】:

  • AddNewtonsoftJson() 仅影响 asp.net core JSON 序列化和模型绑定的默认行为,不影响 Json.NET standalone 或其他应用程序的行为。为此,请参阅Set default global json serializer settings
  • 假设 CosmosDB 正在使用 Json.NET 的全局设置。 (如果您使用JsonSerializer.Create() 而不是JsonSerializer.CreateDefault() 手动构建序列化程序,则全局默认值将被忽略。)您能否请edit 分享minimal reproducible example 来展示如何生成Cosmos DB 错误?
  • 共享代码会很麻烦,这也是您帮助我解决问题的部分原因。我有一个 .NET Core API,所以我看不到如何在比 Startup 更高的级别上独立配置 Json.NET。但是,我已经意识到这些属性用于来自不同项目的类中????‍♂️。我计划在这个周末添加这个解释作为答案,以帮助其他人注意这一点,除非你能提供更多见解。谢谢 dbc!

标签: json.net azure-cosmosdb .net-core-3.1 jsonconverter


【解决方案1】:

在netcore 3.1或更高版本中,可以使用JsonStringEnumConverter:

 var options = new JsonSerializerOptions
        {            
            Converters = { new JsonStringEnumConverter() },
             //other options
        };

在线尝试Example

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多