欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 获取动态key的json对象的值案例

程序员文章站 2022-07-05 09:27:21
问题描述如果直接获取某个json数组中的元素将得到如下的json{ "44": { "height": 25, "appeared": -70000000, "length": 44, "or...

问题描述

如果直接获取某个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;
}

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

相关标签: C# key json