[英]Json with dynamic properties - deserialize into C# object
當用戶單擊“保存”時,我有以下JSON
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#),我有一個ViewModel和.NET將其反序列化回我的viewmodel對象。 在此示例中,此對象具有Id,SomeField1,SomeField2,SomeField3,SomeField4。
我遇到的問題是客戶端只發送實際更新的字段,所以如果用戶從未更新SomeField3,它將不會在json中,並且該數組對象的.NET將具有null作為SomeeField3 ...
所以我無法獲取記錄,將所有字段更新為viewmodel是什么然后調用更新,因為它會將SomeField3設置為null,這是不正確的 - 該字段中可能存在用戶剛才沒有觸及的數據case ..(在另一種情況下,他們可能已經刪除了他們的文本,然后更新將是有效的..
我不確定解決這個問題的最佳方法是什么。 期待您的建議。
我建議你在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轉換為動態對象,然后將動態對象映射到您的靜態類類型模型,根據您的要求從您的db記錄或任何源初始化的類型模型。
//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);
如果您使用Newton Json
進行反序列化。 Newton Json DeserializeObject
方法有一個重載,它以json string
和JsonSerializerSettings
為參數。 JsonSerializerSettings具有NullValueHandling
和MissingMemberHandling
屬性。
MissingMemberHandling :獲取或設置在反序列化期間處理缺少的成員(例如JSON包含不是對象成員的屬性)的方式。
NullValueHandling :獲取或設置序列化和反序列化期間處理null值的方式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.