乘风原创程序

  • C# 获取动态key的json对象的值案例
  • 2021/1/25 11:59:41
  • 问题描述

    如果直接获取某个json数组中的元素将得到如下的json

    {
     "44": {
      "height": 25,
      "appeared": -70000000,
      "length": 44,
      "order": "saurischia",
      "vanished": -70000000,
      "weight": 135000
     }
    }

    这个json对象如果使用c#类来反序列化,那么实体类的结构如下,实体类的类名需要与json对象key相同的才可以使用json反序列化,这样对程序造成了极大的不便。

    public class 44
    {
     public int height { get; set; }
     public int appeared { get; set; }
     public int length { get; set; }
     public string order { get; set; }
     public int vanished { get; set; }
     public int weight { get; set; }
    }
    public class root
    {
     public 44 44 { get; set; }
    }
    

    解决方案

    以上json对象由于key是动态的无法使用c#反序列化,但是直接取到value就能序列化了,如下。

    {
     "height":25,
     "appeared":-70000000,
     "length":44,
     "order":"saurischia",
     "vanished":-70000000,
     "weight":135000
    }

    以上json对象就可以使用我们常用的格式转换了。

    public class root
    {
     public int height { get; set; }
     public int appeared { get; set; }
     public int length { get; set; }
     public string order { get; set; }
     public int vanished { get; set; }
     public int weight { get; set; }
    }

    实现代码

    从动态key的json对象里面拿到value那部分,可以反序列化的字符串,请使用如下的函数,注意引入类库。

    using newtonsoft.json;
    using newtonsoft.json.linq;
    using system.linq;
    /// <summary>
    /// 本类用于处理动态key的json对象
    /// </summary>
    /// <param name="jobject">需要处理的json对象</param>
    /// <returns>json对象的第一个元素的values</returns>
    public static string getjsonvalue(string strjson)
    {
     string strresult;
     jobject jo = jobject.parse(strjson);
     string[] values = jo.properties().select(item => item.value.tostring()).toarray();
     if (values == null)
     {
      strresult = "";
     }
     else
     {
      strresult = values[0];
     }
     return strresult;
    }

    补充:c# 获取json字符串中指定key的值

    背景

    从markdown系统api接口获取到json格式数据,json字符串是不规范的或者说是很难以获取doc_id字段(位于树的叶子节点,但是却不知道有多少个枝干节点),这时想到了采用正则表达式获取指定key的值,于是产生了这篇文章。

    适用场景

    不想要解析整个json字符串,只想获取其中某个key的值

    json字符串对应的对象比较难以构造,只需要获取其中某几个key的值

    json字符串不规范,只需要获取指定key的值(特别是有一些是数组对象,有一些是非数据对象)

    代码

    /// <summary>
    /// 获取json字符串中指定key的值
    /// </summary>
    /// <param name="jsonstring"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public list<string> getjsonvalue(string jsonstring, string key)
    {
     string pattern = $"\"{key}\":\"(.*?)\\\"";
     matchcollection matches = regex.matches(jsonstring, pattern, regexoptions.ignorecase);
     list<string> lst = new list<string>();
     foreach (match m in matches)
     {
      lst.add(m.groups[1].value);
     }
     return lst;
    }
    

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持本教程网。如有错误或未考虑完全的地方,望不吝赐教。