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