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



我有这个JSON:

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

此JSON.NET合同解析程序:

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

我有一个WebApi Controller方法,它使用expando来使用提供的字段对数据库行进行部分更新:

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

我希望反序列化的expando的属性first_namelast_name与我的model/db列名匹配,但它的属性仍然与JSON匹配。直接反序列化到Person可以使用first_namelast_name,正如L.B.在下面帮助我发现的那样,但我的数据库层需要一个Expando来进行部分记录更新,否则它会破坏Person的任何未由json指定的属性,从而破坏模型中的null

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新