[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"
留言
張貼留言