C# 使用自定义ContractResolver将JSON.NET反序列化属性名称转换为ExpandooObject
我有一个JSON:C# 使用自定义ContractResolver将JSON.NET反序列化属性名称转换为ExpandooObject,c#,json,asp.net-web-api,json.net,deserialization,C#,Json,Asp.net Web Api,Json.net,Deserialization,我有一个JSON: {“firstName”:“John”,“lastName”:“Doe”} 此JSON.NET协定解析程序: 公共类CustomContractResolver:DefaultContractResolver{ 受保护的重写字符串ResolvePropertyName(字符串propertyName) { return propertyName.Replace(“”,“”); } } 我有一个WebApi控制器方法,它使用expando来使用提供的字段部分更新db行: 公
{“firstName”:“John”,“lastName”:“Doe”}
此JSON.NET协定解析程序:
公共类CustomContractResolver:DefaultContractResolver{
受保护的重写字符串ResolvePropertyName(字符串propertyName)
{
return propertyName.Replace(“”,“”);
}
}
我有一个WebApi控制器方法,它使用expando来使用提供的字段部分更新db行:
公共虚拟int Post(int id,JObject内容)
{
var obj=JsonConvert.DeserializeObject(content.ToString(),新的JsonSerializerSettings{ContractResolver=new CustomContractResolver()});
数据库更新(id,obj)
}
我希望反序列化的expando的属性first\u name
和last\u name
与我的model/db列名匹配,但它的属性仍然与JSON匹配。直接反序列化到个人
有名字
和姓氏
的功能,正如L.B.在下面帮助我发现的,但我的数据库层需要Expando来更新部分记录,否则,它将吹走json未指定的Person
的任何属性,从而吹走模型中的null
如何在ContractResolver中转换Expando的属性?反序列化时可以使用此ContractResolver
var obj = JsonConvert.DeserializeObject<Person>(
json,
new JsonSerializerSettings {
ContractResolver = new CustomContractResolver()
});
是的,这正是我在问题代码中所做的(除了我的解析器是属性名),但是对象的字段没有改变。@我在发布之前测试过的对象,它工作正常。这是Person类
公共类Person{public string first_name{get;set;}公共字符串last_name{get;set;}
这是json{“firstName”:“John”,“lastName”:“Doe”}
@ThePants顺便说一句:注意我反序列化到Person
类而不是ExpandoObject
是的,我刚刚注意到了这一点并尝试了一下。当我反序列化到Person时,它确实起作用,但不会反序列化到Expando。为什么它对Expandos不起作用?我的数据库层需要Expando do来部分记录更新。好的,我想我看到了问题的根源。ResolvePropertyName
方法始终在Model->Json的同一方向上工作。。。这就是为什么我原来的解析器不能工作。。。这也解释了为什么Expandos不能工作,因为它们没有任何属性名称需要解析。但是,我仍然不知道如何编写一个能够实际使用它们的ContractResolver。您确定您的DB层需要的是expando,可能是IDictionary
?是的,有一个显式检查t==typeof(ExpandObject)
之后,它将从Expando
转换为IDictionary
动态构建列列表。
public class CustomContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
return propertyName.Replace("_","");
}
}