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

标签 c# json asp.net-web-api json.net deserialization

我有这个 JSON:

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

这个 JSON.NET 契约(Contract)解析器:

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匹配我的模型/数据库列名称,但它的属性仍然匹配 JSON。直接反序列化为 Personfirst_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("_",""); 
    }
}

关于c# - 使用自定义 ContractResolver 将 JSON.NET 反序列化属性名称转换为 ExpandoObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20526805/

相关文章:

c# - 使用企业库电子邮件跟踪监听器时获取 ArgumentException "The parameter ' 地址'不能为空字符串"

javascript - MVC 对不同的下拉列表选择执行不同的方法

C# & SQL Server 查询错误 : The multi-part identifier cannot be bound

javascript - 如何在 Threejs 中正确加载 Json 文件

asp.net-web-api - MVC Web API 通过 x-www-form-encoded 发布整数数组

c# - 下载的pdf文件打不开

python - (Pyrebase) 错误 : orderBy must be a valid JSON encoded path

java - 使用 JACKSON 从 JSON 输入向 XML 添加属性

cookies - Owin cookie 身份验证设置-cookie 未保存在浏览器中

c# - 如何删除 HttpClient 请求 header C# 中的默认字符集