Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用自定义ContractResolver将JSON.NET反序列化属性名称转换为ExpandooObject_C#_Json_Asp.net Web Api_Json.net_Deserialization - Fatal编程技术网

C# 使用自定义ContractResolver将JSON.NET反序列化属性名称转换为ExpandooObject

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行: 公

我有一个JSON:

{“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("_",""); 
    }
}