zoukankan      html  css  js  c++  java
  • C# JToken类的使用,实现解析动态json数据、遍历、查找

    在原来解析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();
            }

    运行结果
    这里写图片描述

     
  • 相关阅读:
    CUBA 使用 Spring 查询接口
    Java中的数据验证
    CUBA China 最新进展
    遇见CUBA CLI
    CUBA-Platform将全面助力中国开发者
    ES6 延展操作符
    ES6 解构赋值
    Service Worker
    dom元素上添加断点(使用dom breakpoint找到修改属性的javascript代码)
    svg foreignObject的作用(文本换行,生成图片)
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/9647952.html
Copyright © 2011-2022 走看看