C# Json处理相关
最近工作中遇到的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; } } }