JSON.NET反序列化属性名称转换为具有自定义ContractResolver的ExpandoObject

我有这个JSON:

{"firstName": "John","lastName": "Doe"} 

这个JSON.NET合同解析器:

 public class CustomContractResolver : DefaultContractResolver{ protected override string ResolvePropertyName(string propertyName) { return propertyName.Replace("_",""); } } 

我有这个WebApi Controller方法,使用expando来使用提供的字段部分更新db行:

 public virtual int Post(int id, JObject content) { var obj = JsonConvert.DeserializeObject(content.ToString(), new JsonSerializerSettings { ContractResolver = new CustomContractResolver() }); db.Update(id, obj) } 

我希望反序列化的expando具有属性first_namelast_name以匹配我的模型/ db列名,但是它的属性仍然匹配JSON。 直接反序列化为Personfirst_namelast_name有效,正如LB帮助我在下面发现的那样,但是我的db层需要一个Expando来进行部分记录更新,否则它会吹掉没有被json指定的Person任何属性,因此返回null在模型中。

我可以在ContractResolver中做什么来转换Expando的属性?

您可以在反序列化时使用此ContractResolver

 var obj = JsonConvert.DeserializeObject( json, new JsonSerializerSettings { ContractResolver = new CustomContractResolver() }); 

 public class CustomContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver { protected override string ResolvePropertyName(string propertyName) { return propertyName.Replace("_",""); } }