【发布时间】:2013-12-29 21:05:13
【问题描述】:
我有这个 JSON:
{"firstName": "John","lastName": "Doe"}
这个 JSON.NET 合约解析器:
public class CustomContractResolver : DefaultContractResolver{
protected override string ResolvePropertyName(string propertyName)
{
return propertyName.Replace("_","");
}
}
我有这个 WebApi 控制器方法,它使用扩展来使用提供的字段对数据库行进行部分更新:
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_name 和 last_name 以匹配我的模型/数据库列名,但它的属性仍然与 JSON 匹配。直接反序列化到 Person 具有 first_name 和 last_name 作品,如 L.B.帮助我在下面发现,但我的 db 层需要一个 Expando 用于部分记录更新,否则它将吹走 Person 的任何属性,这些属性未由 json 指定,因此模型中的 null 没有指定。
我可以在 ContractResolver 中做什么来转换 Expando 的属性?
【问题讨论】:
-
您确定您的数据库层期望完全扩展,也许是
IDictionary<string,object>? -
是的,对
t == typeof(ExpandoObject)进行了显式检查,之后它从Expando转换为IDictionary<string,object>动态构建列列表。
标签: c# json asp.net-web-api json.net deserialization