Json的动态特性 - 反序列化到C#对象
我有以下的JSON当用户点击保存Json的动态特性 - 反序列化到C#对象
tasks : {
updated : [
{ Id : 123, SomeField1 : 'new value', SomeField2 : 'new value', SomeField3 : 'new value' },
{ Id : 125, SomeField2 : 'new value' },
{ Id : 127, SomeField1 : 'new value', SomeField4 : 'new value' },
{ Id : 129, SomeField2 : 'new value', SomeField3 : 'new value' },
{ ................ }
],
removed : [
{ Id : 345 },
{ Id : 847 }
]
}
在MVC服务器端(C#),我有一个视图模型和.NET的反序列化这回我的视图模型目的。 在这个例子中,这个对象有Id,SomeField1,SomeField2,SomeField3,SomeField4。
我遇到的问题是客户端只发送实际更新的字段,所以如果用户从未更新过SomeField3,它不会在JSON和.NET中,因为该数组对象将具有SomeeField3作为空值..
所以我无法获取记录,更新所有字段的视图模型是什么,然后调用更新,因为它会将SomeField3设置为null,这是不正确的 - 可能有数据在该字段中,用户刚刚在这种情况下不碰(..在另一种情况下,他们可能已删除他们的文本,然后更新将是有效的..
我不知道什么是解决此问题的最佳方法。 期待您的建议。
我建议你公布更新后的字符串中的API的行动,那么你就可以得到您的解决方案为: 创建动态属性映射函数:
public static class DynamicToStatic
{
public static T ToStatic<T>(object source, T destination)
{
var entity = destination;
//source implements dictionary
var properties = source as IDictionary<string, object>;
if (properties == null)
return entity;
foreach (var entry in properties)
{
var propertyInfo = entity.GetType().GetProperty(entry.Key);
if (propertyInfo != null && entry.Value != null)//Check property and its values exist or not ,change only when source contains value
propertyInfo.SetValue(entity, entry.Value, null);
}
return entity;
}
}
转换您的请求JSON动态对象,然后映射动态对象您的静态类类型模型,类型模型根据您的要求从数据库记录或任何源初始化。
//updatedJsonObjectString bound from request post data(JSONSTRINGIFY of post data)
dynamic source = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(updatedJsonObjectString);
Class1 model = new Class1();//mapped/filled by data call
var retUser = DynamicToStatic.ToStatic<Class1>(source, model);
嗨 JSON的是获得此客户端工具发送的添加,更新和删除的所有在一个JSON请求(不知道我可以改变这一点)。所以我有一个对象 公共类SchedulerHelperSaveObject
你可以按照上面的方法,你可以在DynamicToStatic.ToStatic()实现中设置你的逻辑。 –
检查此http://stackoverflow.com/a/5235927/1365663 –
如果您正在使用Newton Json
进行反序列化。 牛顿Json DeserializeObject
方法有一个过载,它以json string
和JsonSerializerSettings
作为参数。 JsonSerializerSettings具有NullValueHandling
和MissingMemberHandling
属性。
MissingMemberHandling:获取或设置丢失成员如何(例如JSON包含一个属性,该属性是不是对象上的部件)反序列化期间处理 。
NullValueHandling:获取或设置NULL值如何序列化和反序列化
期间您使用的EF保存记录处理? – Komal
是的,EF(Code First)和UnitOfWork。 – Cranzy
您可以使用.IsModified属性更新字段只能在db中更改,如db.Entry(sometable).Property(x => x.somefield).IsModified = true; – Komal