【发布时间】: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