在原来解析json数据是,一般都是用反序列化来实现json数据的解读,这需要首先知道json数据的结构并且建立相应的类才能反序列化,一旦遇到动态的json数据,这种方法就不使用。
为了解决动态解析json数据,微软有个Newtonsoft.Json封装类十分好用,里面的JToken直接实现ling查询。

将json字符串解析为JToken,JObject是JToken的父类,直接使用JToken比较好用

public  static JToken ReadJSON(string jsonStr)
{
JObject jobj = JObject.Parse(jsonStr);
JToken result = jobj as JToken;
return result;
}

JToken.CreateReader() 方法返回一个JsonReader类,用JsonReader类可实现json数据的遍历,可用此实现替换新值
/// <summary>
/// 遍历所以节点,替换其中某个节点的值
/// </summary>
/// <param name="jobj">json数据</param>
/// <param name="nodeName">节点名</param>
/// <param name="value">新值</param>
private static void JSON_SetChildNodes(ref JToken jobj, string nodeName, string value)
{
try
{
JToken result = jobj as JToken;//转换为JToken
JToken result2 = result.DeepClone();//复制一个返回值,由于遍历的时候JToken的修改回终止遍历,因此需要复制一个新的返回json
//遍历
var reader = result.CreateReader();
while (reader.Read())
{
if (reader.Value != null)
{
if (reader.TokenType == JsonToken.String || reader.TokenType == JsonToken.Integer || reader.TokenType == JsonToken.Float)
{
Regex reg = new Regex(@"" + nodeName + "$");
//SelectToken(Path)方法可查找某路径下的节点,在Newtonsoft.Json 4.5 版本中不可使用正则匹配,在6.0版本中可用使用,会方便很多,6.0版本下替换值会更方便,这个需要特别注意的
if (reg.IsMatch(reader.Path))
{
result2.SelectToken(reader.Path).Replace(value);
}
}
}
}
jobj = result2;
}
catch (Exception ex)
{
}
}

在6.0 版本下获取某个节点值非常方便

/// <summary>
/// 获取相应子节点的值
/// </summary>
/// <param name="childnodelist"></param>
private static string JSON_SeleteNode(JToken json, string ReName)
{
try
{
string result = "";
//这里6.0版块可以用正则匹配
var node= json.SelectToken("$.." + ReName);
if (node != null)
{
//判断节点类型
if (node.Type == JTokenType.String || node.Type == JTokenType.Integer || node.Type == JTokenType.Float)
{
//返回string值
result = node.Value<object>().ToString();
}
}
return result;
}
catch (Exception ex)
{
return "";
}
}

测试代码

        static void Main(string[] args)
{ string jsonStr = @"{ 'ROOT': {
'TOKEN': 'aa',
'SERVICE': 'bb',
'DATAPARAM': 'cc'
}
}";
//解析
var json = ReadJSON(jsonStr);
//获取值
string Token = JSON_SeleteNode(json,"TOKEN");
Console.Write(Token);
//设置值
JSON_SetChildNodes(ref json, "SERVICE", "hello world");
Console.Write(json.ToString());
Console.ReadLine();
}

运行结果

 

C# JToken类的使用,实现解析动态json数据、遍历、查找的更多相关文章

  1. IOS开发--解析复杂json数据

    json的自我介绍:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅 ...

  2. Gson解析复杂Json数据

    背景                                                                   json是一种数据格式,便于数据传输.存储.交换. gson是 ...

  3. 解析天气预报JSON数据

    解析天气预报JSON数据 JSON字符串 constjson2 = '{' + #13#10 +'"error":0,' + #13#10 +'"status" ...

  4. mormot解析天气预报JSON数据

    mormot解析天气预报JSON数据 uses SynCommons; constjson2 = '{' + #13#10 +'"error":0,' + #13#10 +'&qu ...

  5. JSONArray ja = JSONArray.fromObject(list);//特殊类 用于将list转化为JSON 数据并返回 out.print(ja);

    JSONArray ja = JSONArray.fromObject(list);//特殊类 用于将list转化为JSON 数据并返回out.print(ja);

  6. 模拟QQ侧滑控件 实现三种界面切换效果(知识点:回调机制,解析网络json数据,fragment用法等)。

    需要用到的lib包 :解析json  gson包,从网络地址解析json数据成String字符串的异步网络解析工具AsyncHttpClient等 下载地址:点击下载 Xlistview 下拉上拉第三 ...

  7. Android网络请求与数据解析,使用Gson和GsonFormat解析复杂Json数据

    版权声明:未经博主允许不得转载 一:简介 [达叔有道]软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family ...

  8. java android使用Gson解析泛型json数据

    那就直接开始吧. 在我们获取服务器返回的json数据有时候会出现这种情况,比如: {"body":{"attrName":"feed",&q ...

  9. Unity3d-XML文件数据解析&amp;JSON数据解析

    1.XML文件数据解析:(首先须要导入XMLParser解析器,The latest released download from:http://dev.grumpyferret.com/unity/ ...

随机推荐

  1. sqoop上传数据到hdfs,并用hive管理数据。

    sqoop导入mysql数据表到HDFS中sqoop import --connect jdbc:mysql://master:3306/test --username root --password ...

  2. 3、eclipse集成svn

    手动安装 1.从官网下载适合自己开发工具的site-.zip文件,网址是:subclipse.tigris.org,2.从中解压出features与plugins文件夹,复制到eclipse的目录my ...

  3. hanlp源码解析之中文分词算法详解

    词图 词图指的是句子中所有词可能构成的图.如果一个词A的下一个词可能是B的话,那么A和B之间具有一条路径E(A,B).一个词可能有多个后续,同时也可能有多个前驱,它们构成的图我称作词图. 需要稀疏2维 ...

  4. kindeditor在线编辑器的使用心得

    1. 如何声明引用? <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  5. JavaScript 基本数据类型和引用类型的区别详解

    js基本数据类型: js基本数据类型包括:undefined,null,number,boolean,string.基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值 1. 基本数据类 ...

  6. azure 1元试用,如何创建虚拟机等

    付了1元后,直接进 https://manage.windowsazure.cn 创建虚拟机即可.

  7. OwnCloud 开源网盘

    https://www.getnas.com/freenas-owncloud/ FreeNAS 插件:OwnCloud 开源网盘 ownCloud 分为服务器端和客户端两个部分,服务器端可以在 Fr ...

  8. SCOPE_IDENTITY的用法【转载】

    SCOPE_IDENTITY   和   @@IDENTITY   的作用都是取得返回在当前会话中的任何表内所生成的最后一个标识值,简单的说就是在执行一条插入语句之后使用@@IDENTITY的全局变量 ...

  9. 关于Zookeeper选举机制

    zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服 ...

  10. [蓝桥杯]ALGO-49.算法训练_寻找数组中最大值

    题目描述: 问题描述 对于给定整数数组a[],寻找其中最大值,并返回下标. 输入格式 整数数组a[],数组元素个数小于1等于100.输出数据分作两行:第一行只有一个数,表示数组元素个数:第二行为数组的 ...