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();
            }

    运行结果
    这里写图片描述

     
  • 相关阅读:
    I NEED A OFFER!
    水题 Codeforces Round #303 (Div. 2) A. Toy Cars
    模拟 HDOJ 5099 Comparison of Android versions
    模拟 HDOJ 5095 Linearization of the kernel functions in SVM
    贪心 HDOJ 5090 Game with Pearls
    Kruskal HDOJ 1863 畅通工程
    Kruskal HDOJ 1233 还是畅通工程
    并查集 HDOJ 1232 畅通工程
    DFS/并查集 Codeforces Round #286 (Div. 2) B
    水题 Codeforces Round #286 (Div. 2) A Mr. Kitayuta's Gift
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/9647952.html
Copyright © 2011-2022 走看看