当前位置:   article > 正文

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

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

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

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

JToken.CreateReader() 方法返回一个JsonReader类,用JsonReader类可实现json数据的遍历,可用此实现替换新值
  • 1
/// <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)
    {
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

在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 "";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

测试代码

        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();
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

运行结果
这里写图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/977766
推荐阅读
相关标签
  

闽ICP备14008679号