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,这是不正确的 - 可能有数据在该字段中,用户刚刚在这种情况下不碰(..在另一种情况下,他们可能已删除他们的文本,然后更新将是有效的..

我不知道什么是解决此问题的最佳方法。 期待您的建议。

+0

期间您使用的EF保存记录处理? – Komal

+0

是的,EF(Code First)和UnitOfWork。 – Cranzy

+0

您可以使用.IsModified属性更新字段只能在db中更改,如db.Entry(sometable).Property(x => x.somefield).IsModified = true; – Komal

我建议你公布更新后的字符串中的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); 
+0

嗨 JSON的是获得此客户端工具发送的添加,更新和删除的所有在一个JSON请求(不知道我可以改变这一点)。所以我有一个对象 公共类SchedulerHelperSaveObject { 公共IEnumerable的添加{get;组; } public IEnumerable updated {get;组; } public IEnumerable removed {get;组; } } 然后我的viewmodel使用这个视图任务或任何即时通讯处理,我已添加和删除所有工作,它只是目前给我一些灰色头发的编辑。 – Cranzy

+0

你可以按照上面的方法,你可以在DynamicToStatic.ToStatic()实现中设置你的逻辑。 –

+0

检查此http://stackoverflow.com/a/5235927/1365663 –

如果您正在使用Newton Json进行反序列化。 牛顿Json DeserializeObject方法有一个过载,它以json stringJsonSerializerSettings作为参数。 JsonSerializerSettings具有NullValueHandlingMissingMemberHandling属性。

  • MissingMemberHandling:获取或设置丢失成员如何(例如JSON包含一个属性,该属性是不是对象上的部件)反序列化期间处理 。

  • NullValueHandling:获取或设置NULL值如何序列化和反序列化