using Newtonsoft.Json;
之前拼接兩個json串,是用的這樣的代碼
var tmp = "," + json1.Substring(1, json1.Length - 2); json2 = json2.Insert(json2 - 1, tmp);
雖然效率挺高的,但是代碼很丑啊
字符串操作的缺陷:
1)不優雅
2)不通用
3)沒有辦法替換原有的值
后來想起可以用dynamic類型來實現
如
string json111, json112; json111 = "{'a':1,'b':2,'d':{}}"; json112 = "{'c':[1,2,3]}"; Console.WriteLine(json111); Console.WriteLine(json112); dynamic d111 = JsonConvert.DeserializeObject<object>(json111); dynamic d112 = JsonConvert.DeserializeObject<object>(json112); d111["c"] = d112["c"]; string json110 = JsonConvert.SerializeObject(d111 as object); Console.WriteLine(json110);
原來是用的 d111.c=d112.c,但是這又相當 不通用,而用 d111["c"]=d112["c"];用變量來代替屬性顯示更通用些
甚至可以拼接二級屬性
d111["d"]["d2"] = d112["c"];
這代碼顯示更優雅些,但是效率肯定不如直接字符串操作了!!
通用代碼如下:
/// <summary> /// 拼接兩個Json串,將targetJson插入到sourceJson中 /// 暫時僅支持一級屬性 /// </summary> /// <param name="sourceJson">源Json串</param> /// <param name="targetJson">插入Json串</param> /// <param name="propNames">要插入Json的屬性列表</param> /// <returns>拼接好的Json串</returns> static string ConcatJson(string sourceJson, string targetJson, string[] propNames) { dynamic source = JsonConvert.DeserializeObject<object>(sourceJson); dynamic target = JsonConvert.DeserializeObject<object>(targetJson); foreach (var prop in propNames) { source[prop] = target[prop]; } return JsonConvert.SerializeObject(source as object); }
調用如下:
string json111, json112; json111 = "{'a':1,'b':2,'d':{}}"; json112 = "{'c':[1,2,3]}"; Console.WriteLine(json111); Console.WriteLine(json112); string json113 = ConcatJson(json111, json112, new string[] {"c"}); Console.WriteLine(json113);
缺陷:
1)需要傳插入json的屬性列表..還是與調用方有耦合(可以確定,用索引是不行的)
2)效率不高,在不講究效率的場景用還可以
3)不支持多層插入.
如果哪位大神有更好 的辦法,請告知我,謝謝!!!