最近工作中遇到的Json問題確實很頭大,主要是各種轉義符的處理,想了一種通用的方式,來處理任意轉移方式的Json字符串:
/// <summary> /// 去除返回值中的轉義符,返回json字符串 /// </summary> /// <param name="str">待處理的轉義符</param> /// <returns></returns> public static string RemoveALLEscape(string str) { string Json = ""; string temp = ""; //能否直接反序列化成為字典格式,如果不能,再判斷是否為全轉義的字符串,如果不能,就返回原值 try { Dictionary<string, object> data = JsonConvert.DeserializeObject<Dictionary<string, object>>(str); Dictionary<string, object> dataNew = new Dictionary<string, object>(); foreach (var dic in data)//遍歷字典,將每個json值轉化為json字符串,自動去轉義然后放到新的字典中;如果不是json格式的,就直接把原值放到新字典中 { object Value = null; if (dic.Value != null) { temp = RemoveALLEscape(dic.Value.ToString());//遞歸遍歷每個值,去掉所有的轉義符 try { var jo = JsonConvert.DeserializeObject(temp); try { Value = JObject.Parse(jo.ToString()); } catch { Value = JArray.Parse(jo.ToString()); } } catch { Value = dic.Value; } dataNew.Add(dic.Key, Value); } else { dataNew.Add(dic.Key, ""); } } Json = JsonConvert.SerializeObject(dataNew); } catch (Exception ex) { string st = ex.Message; Json = StringConvertTojson(str); } return Json; } /// <summary> /// 對json字符串進行去轉義處理 /// </summary> /// <param name="str"></param> /// <returns></returns> private static string StringConvertTojson(string str) { string json = str; try { var jo = JsonConvert.DeserializeObject(json); try { JObject jobj = JObject.Parse(jo.ToString()); json = JsonConvert.SerializeObject(jobj); } catch { JArray jobj = JArray.Parse(jo.ToString()); json = JsonConvert.SerializeObject(jobj); } } catch { } return json; }
進行去轉義處理主要是為了下一步的工作打算:根據維護好指定格式的Json路徑,取出到該路徑下的Json值,約定的Json格式如下(與Jmeter中使用JSON Extractor解析Json格式一致):
data.data.data[0].data
解析Json路徑如下:
/// <summary> /// 根據Json路徑去動態解析json,獲取指定路徑字段下的值 /// </summary> /// <param name="JsonPath">維護好的Json路徑,格式為data.data.data[0].data</param> /// <param name="Resp">需要解析的Json,先做去轉義和格式化處理</param> /// <returns></returns> private static dynamic GetJsonPath(string JsonPath, string Resp) { JObject jobj = JObject.Parse(Resp); dynamic Value = null; dynamic temp = null; int Idex = 0; string[] Path = JsonPath.Split('.'); try { for (int i = 0; i < Path.Length; i++) { string path = Path[i]; if (!path.Contains("[") && !path.Contains("]")) { if (i == 0) { temp = jobj[path]; } else { temp = temp[path]; } } else if (Path[i].Contains("[") && Path[i].Contains("]")) { int idex = Path[i].IndexOf('['); Path[i] = Path[i].Remove(0, idex); Path[i] = Path[i].Replace("]", "").Replace("[", ""); Idex = Convert.ToInt32(Path[i]); path = path.Replace("[" + Idex + "]", ""); if (i == 0) { temp = jobj[path][Idex]; } else { temp = temp[path][Idex]; } } if (i == (Path.Length - 1)) { Value = temp; } } } catch (Exception ex) { Value = Path + "處理有誤"; } return Value; }
最后是Json格式化:
/// <summary> /// 格式化json字符串 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string ConvertJsonString(string str) { JsonSerializer serializer = new JsonSerializer(); TextReader tr = new StringReader(str); JsonTextReader jtr = new JsonTextReader(tr); object obj = serializer.Deserialize(jtr); if (obj != null) { StringWriter textWriter = new StringWriter(); JsonTextWriter jsonWriter = new JsonTextWriter(textWriter) { Formatting = Formatting.Indented, Indentation = 4, IndentChar = ' ' }; serializer.Serialize(jsonWriter, obj); return textWriter.ToString(); } else { return str; } } }
