簡體   English   中英

具有動態屬性的Json - 反序列化為C#對象

[英]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 stringJsonSerializerSettings為參數。 JsonSerializerSettings具有NullValueHandlingMissingMemberHandling屬性。

  • MissingMemberHandling :獲取或設置在反序列化期間處理缺少的成員(例如JSON包含不是對象成員的屬性)的方式。

  • NullValueHandling :獲取或設置序列化和反序列化期間處理null值的方式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM