最近工作中遇到的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. KVM嵌套虚拟化nested之CPU透传

    嵌套式虚拟nested是一个可通过内核参数来启用的功能.它能够使一台虚拟机具有物理机CPU特性,支持vmx或者svm(AMD)硬件虚拟化.该特性需要内核升级到Linux 3.X版本 ,所以在cento ...

  2. 安装Hive过程中报错:Unsupported major.minor version 52.0

    在安装hive的过程中,我觉得我是按照教程走的,但是在启动hive时还是报错了,错误如下 Exception in thread "main" java.lang.Unsuppor ...

  3. 2019-2-25SqlServer 中所有表、列、视图、索引、主键、外键等常用sql

    sp_help Accounts_Users     其中Accounts_Users 表示表名 sp_columns Accounts_Users exec  sp_helpconstraint   ...

  4. Spring Cloud微服务笔记(一)微服务概念

    微服务概念 一.什么是微服务架构 微服务,是一个小的.松耦合的分布式服务. 为什么需要微服务: 1)单体系统部署在一个进程中,修改了一个小功能,为了部署上线就会影响其他功能. 2)单体应用各个功能模块 ...

  5. Android系统文件目录路径说明

    系统数据存储路径,如下:其中应用程序包名为:com.spt ContextWrapper类中,包含以下方法: 1. getFilesDir() --> 内部存储 @Override public ...

  6. linux(debian) arm-linux-g++ v4.5.1交叉编译 embedded arm 版本的QtWebkit (browser) 使用qt 4.8.6 版本 以及x64上编译qt

    最近需要做一个项目 在arm 架构的linux下 没有桌面环境的情况下拉起 有界面的浏览器使用. 考虑用qt 的界面和 qtwebikt 的库去实现这一系列操作. 本文参考: Qt移植到ARM Lin ...

  7. HTML入门5

    格式化文本,高阶处理,接下来了解,标记引文,描述列表,计算机代码和其他文本,上下标,联系信息等数据. 学习不太知名的HTML元素来标记高级语义特征. 描述列表,也叫自定义列表,第三种类型的列表,除了u ...

  8. [LeetCode] Most Common Word 最常见的单词

    Given a paragraph and a list of banned words, return the most frequent word that is not in the list ...

  9. apache启动不了应对方法

    原因一:80端口占用 例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突 装了某些软件会使apache无法启动如Dr.com 你打开网络连接->TcpIp ...

  10. monkey Test 环境配置

    Android Monkey压力测试学习笔记 步骤:下载SDK -> 解压进入SDK Manager下载系统 -> 配置环境变量 -> 创建虚拟设备或连接真机 -> 进入命令模 ...