我们正在将一个对象序列化为 JSON,该对象具有一个动态对象数组的属性,例如:
public List<dynamic> Widgets { get; set; }
public string Name {get;set;}
序列化设置为使用内置的驼峰大小写解析器,选项ProcessDictionaryKeys设置为true,根据这篇文章的建议:
var contractResolver = new CamelCasePropertyNamesContractResolver();
contractResolver.NamingStrategy.ProcessDictionaryKeys = true;
jsonSerializerSettings.ContractResolver = contractResolver;
但是,生成的 JSON 为此字段中的条目保留 pascal 大小写(这是对象在数据库中的存储方式)。所有其他属性将按预期转换为骆驼大小写。
上述示例输出:
{
name:"test",
widgets:[{Name:"Widget1",Description:"A nice widget"}]
}
那么,为什么命名策略仅适用于强类型的 C# 对象,而不适用于这些动态值呢?
我已经验证了显而易见的事情,即确保正在应用序列化设置。
感谢 dbc 的帮助。
万一其他人有问题,问题是底层对象是一个 JObject - 出于某种原因,我认为它将是一个 ExpandoObject。
JSON.net 不会尊重 JObjects 的命名约定,它们是按原样序列化的,因此您必须提出一些解决方案来手动转换对象键。
根据这篇文章,我选择了一个自定义对象转换器:如何以与使用 Json.NET 的对象相同的方式序列化 JObject?