C# 获取动态key的json对象的值案例
作者:冬冬冬冬冬冬冬冬冬冬 发布时间:2023-03-03 22:02:08
标签:C#,key,json
问题描述
如果直接获取某个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;
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/chaoyangzhixue/article/details/52873484


猜你喜欢
- 第一步:官网(或跟硬件开发WMI的人沟通你需要的接口和参数定义,如果是和硬件开发的人协定WMI接口,直接看第二步)查找你需要的WMI信息;举
- 1.建议设置窗体为双缓冲绘图,可有效避免界面刷时引起的闪烁this.SetStyle(ControlStyles.AllPaintingIn
- 本文实例讲述了C# Console利用mspaint打开图像并保存的方法。分享给大家供大家参考,具体如下:调用画图板压缩图片System.D
- 本文实例讲述了C#实现多线程的Web代理服务器。分享给大家供大家参考。具体如下:/**Proxy.cs:C# Programming Tip
- hello, everyone. Long time no see. 本期文章,我们主要讲解一下二叉树的相关概念,顺便也把搜索二叉树(也叫二
- 使用TransitionDrawable渐变切换多张图片,供大家参考,具体内容如下1、定义变量private int change = 0;
- 本文实例为大家分享了Android调用系统图库获取图片的具体代码,供大家参考,具体内容如下1、开发工具与关键技术:Eclipse、Andro
- Android客户端请求服务器端的详细解释1. Android客户端与服务器端通信方式: Android与服务器通信通常采用HTTP通信方式
- 1、简介单例模式使⽤场景:业务系统全局只需要⼀个对象实例,⽐如发号器、 redis 连接对象等。Spring IOC容器中的 Bean 默认
- QR 二维码中插入图片二维码终于火了,现在大街小巷大小商品广告上的二维码标签都随处可见,而且大都不是简单的纯二维码,而是中间有个性图标的二维
- 目录前言简单示例基础操作定时取消关联取消判断取消源码探究构造入手小插曲WaitHandle注册操作取消操作Cancel操作CancelAft
- 一、反射的基本概念1、反射的概念将类的各个组成部分封装成其他对象,这就是反射的机制.通过上图,我们可以通过反射获得Person类的Class
- Spring Boot产生环形注入***************************APPLICATION FAILED TO STAR
- 从Microsoft .Net 2.0版本以后,就默认提供了System.IO.Ports.SerialPort类,用户可以非常简单地编写少
- 在之前博文中多次使用了点击事件的处理实现,有朋友就问了,发现了很多按钮的点击实现,但有很多博文中使用的实现方式有都不一样,到底是怎么回事。今
- 目录1、效果视频2、剖析Android坐标系3、实现方式3.1 layout3.2 scrollBy3.3 offsetLeftAndRig
- 一. MediaPlayer 状态机 介绍Android MediaPlayer 状态即图例 :1. Idle (闲置) 状态 和 End
- 归并排序简单解释:该算法是采用分治法,把数组不断分割,直至成为单个元素,然后比较再合并(合并的过程就是两部分分别从头开始比较,取出最小或最大
- 前言最近在学习spring,抽空会将学习的知识总结下面,本文我们会接触spring 4的新功能:@Conditional注解。在之前的spr
- 修改readme.txt文件如下:Git is a distributed version control system.Git is fr