【发布时间】:2019-03-21 21:35:10
【问题描述】:
我扩展了 Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver 并在我的 WebApi 中应用新的解析器:
public static void Register(HttpConfiguration config)
{
var json = config.Formatters.JsonFormatter.SerializerSettings;
json.ContractResolver = new CustomPropertyNamesContractResolver();
json.Formatting = Formatting.Indented;
config.MapHttpAttributeRoutes();
}
这是我的自定义名称解析器(CustomPropertyNamesContractResolver 类)的重写方法:
protected override string ResolvePropertyName(string propertyName)
{
if (propertyName.Equals("ID"))
return "id";
// return the camelCase
propertyName = base.ResolvePropertyName(propertyName);
if (propertyName.EndsWith("ID"))
propertyName = propertyName.Substring(0, propertyName.Length - 1) + "d";
return propertyName;
}
我的问题是结果确实是驼峰式的,但是像“QuestionID”这样的属性永远不会转换为“questionId”——我一直收到的是“questionID”。
另外,我的自定义 ResolvePropertyName() 方法永远不会被调用(用断点测试它),所以似乎只有我的父类 (CamelCasePropertyNamesContractResolver) 的 ResolvePropertyName() 方法被以某种方式调用。
现在,当我直接从 DefaultContractResolver(CamelCasePropertyNamesContractResolver 的父级)继承时,我的自定义 ResolvePropertyName() 方法被调用。
谁能解释一下这里发生了什么? 我错过了什么吗?
【问题讨论】:
-
这种行为的原因是 CamelCasePropertyNamesContractResolver.ResolvePropertyName() 的签名,如下所示?受保护的内部覆盖字符串 ResolvePropertyName(string propertyName)
标签: c# json json.net asp.net-web-api2 camelcasing