[Json]判斷 資料 是否已存在 Json字串內,是 則更新字串,否 則將資料加入字串

 有時候資料庫設計並不會特定開張表來儲存「使用者變更的欄位資訊」,我遇過幾個SD的設計是將「使用者變更的欄位資訊」轉換為一個JsonString再存入資料庫的一個欄位裡面(有點no sql的感覺,就是在做欄位變更的時候可能會比較方便)。

這時候我們就會很常遇到要對JsonString做新增修改的動作,因此我就想寫一個JsonHelper,可以來對JsonString的編修做處理。

範例:

這支JsonHelper主要的設計是將「資料庫的JsonString (List)」與 「有要編修的資料Data(單筆)」做比對,並判斷這筆Data對JsonString來說是Add還是Edit,那如何判定是Add還是Edit呢?這邊我多加一個參數「comparisonparamName」也就是要比對的屬性名稱,如果FindIndex在JsonString內有比對到跟Data相同的資料則代表是Edit。

1.測試用模型

 public class JsonTestModel
    {
        public string Name { get; set; }
        public string Value { get; set; }
    }

2.JsonHelper Code

  /// <summary>
    /// Json Helper
    /// </summary>
    public static class JsonHelper
    {
        /// <summary>
        /// Upadte Json Data List by data And Comparison Parameter Name
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jsonString">Json Data List(string)</param>
        /// <param name="data">(update Data)</param>
        /// <param name="comparisonparamName">( Comparison Parameter Name)</param>
        /// <returns></returns>
        public static string UpdateJsonDataList<T>(string jsonString, T data, string comparisonparamName)
        {
            var list = new List<T>();
            if (!string.IsNullOrWhiteSpace(jsonString))
            {
                list = JsonConvert.DeserializeObject<List<T>>(jsonString);
            }
            var type = typeof(T);
            var comparisonparam = type.GetProperty(comparisonparamName);
            var dataComparisonparamValue = comparisonparam.GetValue(data);
            var index = list.FindIndex(x => comparisonparam.GetValue(x).Equals(dataComparisonparamValue));
            //add
            if (index == -1)
            {
                list.Add(data);
            }
            //update
            else
            {
                list[index] = data;
            }
            jsonString = JsonConvert.SerializeObject(list);
            return jsonString;
        }
    }

3.測試 Code

    var data = new List<JsonTestModel>()
            { new JsonTestModel(){Name="O1"}};
            var json = JsonConvert.SerializeObject(data);
            //Add
            var add = new JsonTestModel() { Name = "A1" };
            json = JsonHelper.UpdateJsonDataList(json, add, nameof(JsonTestModel.Name));
            data = JsonConvert.DeserializeObject<List<JsonTestModel>>(json);
            //Edit "A1
            var modify = new JsonTestModel() { Name = "A1",Value="Modify1" };
            json = JsonHelper.UpdateJsonDataList(json, modify, nameof(JsonTestModel.Name));
            data = JsonConvert.DeserializeObject<List<JsonTestModel>>(json);    

 (1)原始資料只有O1



 (2)新增A1



 (3)編修A1 設定Value 為 "Modify1"



留言

這個網誌中的熱門文章

[Visual Studio]位於網際網路或是限制區域上 或是檔案上標有 web 字樣 所以無法處理該檔案。若希望處理這些檔案 請移除 web 字樣。

[IIS] IIS執行時,發生拒絕存取路徑 問題

[windows] xcopy 備份至 「網路磁碟機」