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;
            }
        }
    }

 

posted @ 2019-01-02 21:53  这个达  阅读(1037)  评论(0编辑  收藏  举报