最近工作中遇到的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 = ;
string[] Path = JsonPath.Split('.');
try
{
for (int i = ; i < Path.Length; i++)
{
string path = Path[i];
if (!path.Contains("[") && !path.Contains("]"))
{
if (i == )
{
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(, idex);
Path[i] = Path[i].Replace("]", "").Replace("[", "");
Idex = Convert.ToInt32(Path[i]);
path = path.Replace("[" + Idex + "]", "");
if (i == )
{
temp = jobj[path][Idex];
}
else
{
temp = temp[path][Idex];
}
}
if (i == (Path.Length - )) { 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 = ,
IndentChar = ' '
};
serializer.Serialize(jsonWriter, obj);
return textWriter.ToString();
}
else
{
return str;
}
}
}

C# Json处理相关的更多相关文章

  1. JS JSON对象相关

    1.多对象合并 将2个或2个以上对象(object{....})中的属性进行合并,即最后合并为一个object{.....} 解决办法:Object.assign 方法 var form = {nam ...

  2. .net core json配置相关用法

    在.net core中,配置文件差不多都是json文件.我们在开发程序的时候,可以使用系统默认的appsettings.json,可以自定义json配置文件.当json配置文件里面的参数改变时,程序也 ...

  3. Json概述以及python对json的相关操作

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Langu ...

  4. Json概述以及python对json的相关操作(转)

    什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...

  5. json字符串相关转换方法

    /** json转换为Map * @param jsonStr json * @return map集合 */ public static HashMap<String, String> ...

  6. python对json的相关操作

    什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...

  7. Json概述以及python对json的相关操作《转》

    什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...

  8. [转]python对json的相关操作

    json官方说明参见:http://json.org/ Python操作json的标准api库参考:http://docs.python.org/library/json.html 对简单数据类型的e ...

  9. json接口相关(建议结合JFinal框架)

    /** * */ package net.wicp.wvqusrtg; import java.util.HashMap; import net.sf.json.JSONArray; import n ...

  10. WebService返回数据前台获取并处理JSON的相关问题

    起因: 记录这个问题的起因是一次解答网友的问题,当初自己初次接触webservice时也遇到过,但在写答案时,并没有很深的印象,只是知道webservice在后台返回值的时候,那里是有个坑的.网友问的 ...

随机推荐

  1. Git 配置用户名、密码

    在终端输入: git config --global credential.helper store 然后git pull一次,输入一次用户名密码就会自动保存该用户名密码: 查看配置的用户信息: gi ...

  2. Gym 100963B

    Gym 100963B啊,郁闷,就tm调小了一点范围就A了,就写dp和贪心比较一下,范围到最大值的二倍-1就好了假设最大值的2倍以内能满足最优条件,当金额范围超过最大值2倍的时候:至于为什么,还不清楚 ...

  3. Java 使用blob对H5视频播放进行加密《java视频加密》

    1.创建一个H5 <video>标签 <video id="sound" type="video/mp4" controls="co ...

  4. centos升级python2.7到3.6之后造成yum命令报错

    今天学习浏览器模拟,把云端centos上的python2.7升级到3.6,但是安装其他软件时发现报如下错误: File "/usr/bin/yum", line 30 except ...

  5. linux中python3安装和使用

    python安装 下载python安装包和依赖环境 #自由选择python3源码包的版本https://www.python.org/ftp/python/https://www.python.org ...

  6. 【整理】Java 8新特性总结

    闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...

  7. Python线性表——单链表

    1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱 ...

  8. 12树莓派VNC远程桌面

    2017-09-04 23:11:28 http://bbs.elecfans.com/forum.php?mod=viewthread&tid=583803&extra=     开 ...

  9. jmeter基本组成原件介绍

    jmeter基本组成原件介绍 参考地址:https://wenku.baidu.com/view/d4986ca2aaea998fcc220ec1.html 从性能工具的原理划分: Jmeter工具和 ...

  10. IIC稳定性.VBS

    Sub Main Dim cnt Dim delay Dim time Dim atttime atttime = 20 delay = 3000 time = 50 crt.screen.Send ...