zoukankan      html  css  js  c++  java
  • 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;
                }
            }
        }
  • 相关阅读:
    C#递归方法把数据表加载到treeview控件(C/S和B/S) 子曰
    ASP.NET 2.0 Web Part编程入门(转) 子曰
    C#中委托的运用 子曰
    window.returnValue使用方法(转) 子曰
    Treevi中的checkbox联动选择,以及Treeview的生成(即选择或取消复选框,其自选框同时选择或取消) 子曰
    发布MicrosoftReportViewer时的问题 子曰
    WCF,Net Remoting,Web service概念和区别 子曰
    使用sql字符串查询关键字CHARINDEX 子曰
    Mysql安装时出现APPLY security settings错误 子曰
    设计模式——单例模式(Singleton)
  • 原文地址:https://www.cnblogs.com/rd-ddddd/p/10211535.html
Copyright © 2011-2022 走看看