C# JToken类的使用,实现解析动态json数据、遍历、查找

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

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

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

1JToken.CreateReader() 方法返回一个JsonReader类,用JsonReader类可实现json数据的遍历,可用此实现替换新值 2 3 4/// <summary> 5/// 遍历所以节点,替换其中某个节点的值 /// </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 版本下获取某个节点值非常方便

1/// <summary> 2/// 获取相应子节点的值 /// </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 ""; } }

测试代码

1 static void Main(string[] args) 2 { 3 4 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(); }

运行结果
这里写图片描述

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )