JObject转换修改key值

C# JSON反序列化:JObject强制转换异常分析与解决方案 JSON作为现代应用数据交换的核心格式,其序列化与反序列化是软件开发中的基础操作。在C#生态中,Newtonsoft.Json(Json.NET)通过将JSON字符串转换为内存对象实现数据绑定,这一过程涉及类型系统映射与数据格式解析。当开发者尝试将动态JSON容器JObject直接强制转换为自定义强类型时,会触发InvalidCastException,这源于C#强类型系统与动态数据结构间的本质差异。理解JObject作为动态查询容器的本质,掌握ToObject<T>()方法进行安全转换,能有效避免类型转换 阅读详情
/// <summary>
/// JObject转换类
/// </summary>
public class ObjectConverter
{
	/// <summary>
	/// 将JObject转换Key值
	/// </summary>
	/// <param name="inputObject">输入的JSON对象</param>
	/// <param name="propertyPairs">旧key与新key对应关系</param>
	/// <param name="bOnlyNecessaryKeys">是否仅保留必要的键值(否则保留全部键值)</param>
	/// <param name="bAddSerialNumber">是否添加序列号(仅当value为JArray且序列号键名非空时生效)</param>
	/// <param name="sSerialNumberKey">序列号键名</param>
	/// <returns>转换后的JObject</returns>
	public static JObject Convert(JObject inputObject, Dictionary<string, string> propertyPairs, bool bOnlyNecessaryKeys = true, bool bAddSerialNumber = true, string sSerialNumberKey = "NO")
	{
		var jObjectResult = new JObject();
		try
		{
			if (null != inputObject && 0 < inputObject.Count && null != propertyPairs && 0 < propertyPairs.Count)
			{
				var lstKey = propertyPairs.Keys.ToList();
				var lstObjectKey = inputObject.Properties().ToList();
				for (int i = 0; i < lstObjectKey.Count(); i++)
				{
					var p = lstObjectKey[i];
					var sOldKey = lstKey.FirstOrDefault(k => 0 == string.Compare(p.Name, (k.IndexOf(",") != -1 ? k.Split(',')[0] : k), StringComparison.OrdinalIgnoreCase));
					var sTsOldKey = sOldKey;
					if (!string.IsNullOrEmpty(sTsOldKey) && sTsOldKey.IndexOf(",") != -1)
					{
						sOldKey = sTsOldKey.Split(',')[0];
					}
					var sNewKey = (!string.IsNullOrEmpty(sTsOldKey)) ? propertyPairs[sTsOldKey] : p.Name;
					if (bOnlyNecessaryKeys && !propertyPairs.Values.Contains(sNewKey))
					{
						continue;
					}
					var jToken = inputObject[p.Name];
					if (!string.IsNullOrEmpty(sTsOldKey) && sTsOldKey.IndexOf(",") != -1)
					{
						jToken = "";
						foreach (var sItem in sTsOldKey.Split(','))
						{
							jToken += inputObject[sItem] + "|";
						}
					}
					if (jToken is JObject)
					{
						var jObj = (JObject)jToken;
						var jObjNew = Convert(jObj, propertyPairs, bOnlyNecessaryKeys, bAddSerialNumber, sSerialNumberKey);
						if (null != jObjNew)
						{
							jObjectResult.Add(sNewKey, bOnlyNecessaryKeys ? KeepNecessaryKeys(jObjNew, propertyPairs.Values.ToList()) : jObjNew);
						}
					}
					else if (jToken is JArray)
					{
						var jArray = (JArray)jToken;
						var jArrayResult = new JArray();
						for (int j = 0; j < jArray.Count; j++)
						{
							var jObject = Convert(jArray[j] as JObject, propertyPairs, bOnlyNecessaryKeys, bAddSerialNumber, sSerialNumberKey);
							if (null != jObject)
							{
								jArrayResult.Add(bOnlyNecessaryKeys ? KeepNecessaryKeys(jObject, propertyPairs.Values.ToList()) : jObject);
							}
							if (bAddSerialNumber && !string.IsNullOrEmpty(sSerialNumberKey))
							{
								AddSerialNumber(ref jArrayResult);
							}
						}
						if (jObjectResult.ContainsKey(sNewKey))
						{
							jObjectResult[sNewKey] = jArrayResult;
						}
						else
						{
							jObjectResult.Add(sNewKey, jArrayResult);
						}
					}
					else
					{
						if (jObjectResult.ContainsKey(sNewKey))
						{
							jObjectResult[sNewKey] = jToken;
						}
						else
						{
							jObjectResult.Add(sNewKey, jToken);
						}
					}
				}
			}
		}
		catch
		{
			jObjectResult = null;
		}
		return jObjectResult;
	}

	/// <summary>
	/// 只保留必要的键值
	/// </summary>
	/// <param name="jObject">要进行处理的对象</param>
	/// <param name="lstKey">要保留的键值</param>
	/// <returns>处理后的对象</returns>
	private static JObject KeepNecessaryKeys(JObject jObject, List<string> lstKey)
	{
		var jObjectResult = new JObject();
		try
		{
			if (null != jObject && null != lstKey)
			{
				lstKey.ForEach(p =>
				{
					if (jObject.ContainsKey(p))
					{
						jObjectResult.Add(p, jObject[p]);
					}
				});
			}
		}
		catch
		{
			jObjectResult = null;
		}
		return jObjectResult;
	}

	/// <summary>
	/// JArray各对象添加序列号
	/// </summary>
	/// <param name="jArray">输入的JSON对象</param>
	/// <param name="sKey">添加的序列号字段</param>
	/// <returns></returns>
	public static void AddSerialNumber(ref JArray jArray, string sKey = "NO")
	{
		try
		{
			if (null != jArray && 0 < jArray.Count)
			{
				for (int i = 0; i < jArray.Count; i++)
				{
					jArray[i][sKey] = i + 1;
				}
			}
		}
		catch
		{
		}
	}

	/// <summary>
	/// 获取JObject的一个值(只处理简单类型,不处理JArray)
	/// </summary>
	/// <param name="jObject">JSON对象(将尝试转换为JObject)</param>
	/// <param name="sKey">键名</param>
	/// <param name="bTopLevelOnly">是否只取最高一层级的值(否则将继续取子级)</param>
	/// <returns>值</returns>
	public static object GetValue(object jObj, string sKey, bool bTopLevelOnly = true)
	{
		object objResult = null;
		if (null == jObj || string.IsNullOrEmpty(sKey))
			return objResult;
		if (jObj.GetType().Name != "JObject")
			return objResult;
		var jObject = (JObject)jObj;
		if (null == jObject)
		{
			return objResult;
		}
		if (jObject.ContainsKey(sKey))
		{
			var jValue = jObject[sKey];
			if (null != jValue && jValue.Type != JTokenType.Array && jValue.Type != JTokenType.Object)
			{
				objResult = jValue;
			}
		}
		else
		{
			if (!bTopLevelOnly)
			{
				var jEnum = jObject.GetEnumerator();
				while (jEnum.MoveNext())
				{
					if (jEnum.Current.Value == null)
						continue;
					if (jEnum.Current.Value.Type != JTokenType.Object)
						continue;
					var jSubObject = (JObject)jEnum.Current.Value;
					if (null == jSubObject)
						continue;
					objResult = GetValue(jSubObject, sKey, bTopLevelOnly);
					if (null != objResult)
						break;
				}
			}
		}
		return objResult;
	}
}

 

C#中使用JArray和JObject简介 本文介绍了C#中使用JArray和JObject的基本操作,分别用于处理JSON数组和JSON对象。在实际项目中,我们可以根据需求灵活运用JArray和JObject,处理和操作JSON数据。JObject则适用于操作JSON对象,可以进行键值对的添加、遍历和获取属性值等操作。同时,Json.NET还提供了丰富的方法来进一步处理JSON数据,例如查询、修改、删除等操作,可以根据具体需求进行学习和使用。其中,JArray和JObject是Json.NET中的两个重要类,用于处理JSON数组和JSON对象。 阅读详情

相关推荐

CKEditor5富文本编辑器 - 视频引入、预览及自定义toolbar

文章目录定义遇到的问题视频部分引入媒体url失败原因解决方法:自定义视频provider视频预览及页面不显示视频问题解决方案:H5 \标签如何移除toolbar中的部分插件 一个小后端很少接触前端框架,只能在知识的海洋中漂泊。。。 定义 <script src="https://cdn.ckeditor.com/ckeditor5/16.0.0/classic/ckeditor.js"&gt...

huhui806的博客 8196

c# JObject转换key值

JObject对象有多个key和value组成,先要将英文的key转为中文,封装了一个方法,用于对key值的转换。 转换前JObject的值如下所示:

每天学习一点点 3199

Dify工作流自动化:如何用Trae AI助手10倍提升你的开发效率(含避坑指南)

本文详细介绍了如何利用Trae AI助手自动化生成Dify工作流,实现开发效率的10倍提升。通过构建DSL示例库、精准需求描述和四步实战法,开发者可将重复的配置工作交给AI,快速生成可运行的工作流,并提供了关键的避坑指南。

weixin_29062865的博客 369

JObject 用法 、JProperty 用法、JArray 用法 Linq 转 Json

使用LINQ to JSON前,需要引用Newtonsoft.Json的dll和using Newtonsoft.Json.Linq的命名空间。LINQ to JSON主要使用到JObject, JArray, JProperty和JValue这四个对象, JObject用来生成一个JSON对象,简单来说就是生成”{}”, JArray用来生成一个JSON数组,也就是”[]”, JProperty...

qq_27320703的博客 1481

基于Plecs的LLC谐振变换器闭环设计:从PI参数整定到动态响应优化

本文详细介绍了在Plecs仿真环境中,如何为半桥LLC谐振变换器设计并优化闭环控制系统。从开环模型搭建与特性分析入手,重点阐述了基于频域法的PI控制器参数整定流程,并通过负载阶跃、输入电压突变等测试优化动态响应。文章还分享了从仿真模型过渡到实际硬件时的关键注意事项,帮助工程师实现稳定、高效的电源设计。

e4f5g6h的博客 623

视觉Transformer实战 | Token-to-Token Vision Transformer(T2T-ViT)详解与实现

Vision Transformer (ViT) 在计算机视觉领域取得了巨大成功,但标准的 ViT 存在一些局限性,如需要大规模预训练数据、对局部结构建模不足等。Token-to-Token ViT (T2T-ViT) 通过引入渐进式分词过程改进了原始 ViT,使其能够在中小型数据集上取得更好的性能。本节将详细介绍 T2T-ViT 的技术原理,并使用 PyTorch 从零开始实现 T2T-ViT。

盼小辉丶的博客 4万+

js修改对象数组的key值

实例:将dataOld这个对象数组的对象中的属性key变成dataNew中的形式; 方法一:使用map循环,在map循环内创建一个新对象,将item要改变的key赋给新创建的对象里面新key值,然后push给一个新创建的数组dataNew即可; 方法二:使用map循环 + replace替换,通过循环然后将子类JSON.stringify后采用replace来改变属性key; 方法三:使用forEach循环 + for循环,通过Object.keys()来改变属性key; 结果:...

lemon今天学习了吗?的博客 2万+

2026.5.3:Ubuntu26.04下uv所需的环境变量pyproject.toml

本文档提供了Python开发环境的配置指南。主要包括: 设置环境变量(HF_ENDPOINT、UV_PYTHON_INSTALL_MIRROR等) 创建pyproject.toml配置文件,定义项目元数据(名称、版本等) 指定依赖项(torch系列库)及其安装源(PyTorch官方CUDA 12.8镜像) 配置Python版本要求(>=3.13,<3.14) 设置平台限制(Linux/Windows) 该配置适用于需要PyTorch CUDA 12.8支持的项目开发环境搭建。

拥抱具身智能,昇腾Ascend C 586

如何修改数组对象的属性名(把key替换成想要的key,值不变)

场景: 比如后端返回给一个数组对象,但是名字不是我们想要的,我们可以修改key值变成我们想要的数组。 比如把下面的第一个数组中key值的名称改成第二个数组中key值的名称 arr: [ { name: '小太阳', year: 18}, { name: '大太阳', year: 19}] brr: [ { userName: '小太阳', age: 18}, { userName: '大太阳', age: 19} ] 方法: changeKey (arr, key) { let newArr =

小太阳的博客 8728

Cesium 实现动态加载气象数据:渲染成动态雨雪/云层效果(源码 + 原理)

本文介绍了在Cesium中实现动态天气效果的技术方案。核心思路是通过时间轴驱动多层数据动态切换,包括:1)时间维度处理,按序列加载不同气象图层;2)空间维度处理,将气象数据切分为瓦片;3)效果层实现,制作风场、降水等动态可视化效果。文章详细讲解了后端数据预处理(生成瓦片和风场JSON)、前端实现(双层雷达瓦片交替渐变、风场粒子系统)的具体方法,并提供了完整的代码示例。此外还探讨了雨雪粒子、云层效果等增强功能,以及工程化建议,为构建科学准确的动态天气可视化系统提供了实用解决方案。

专注AI大模型,软件混淆,授权 620

物联网应用开发教程专栏介绍与说明——列表目录查阅(持续更新)

为方便查阅学习本专栏,特整理专栏介绍与说明及提供列表目录便于查阅。阿齐Archie《物联网应用开发教程》专栏。本专栏为物联网应用开发教程,将更新涵盖常见的WIFI、蓝牙、蜂窝网、以太网、Lora、NB-iot等物联网技术实战应用及详解其技术知识。专栏为技术文章,订阅一个文章即可本专栏内所有文章可看,实战开发,亲测无误,附视频演示效果,会持续更新本专栏。本专栏内有理论篇也有完整实战应用篇。

嵌入式阿齐Archie 2万+

C# NEWTONSOFT.JSON更改json文件

public static void Update() { string jsonfile = Directory.GetCurrentDirectory() + "\\config.json"; if (File.Exists(jsonfile)) { string jsonString = File.ReadAllText(jsonfile, Encoding.Default);//...

rs_90的博客 1422

044、手持视频抖动严重?OpenCV 光流 + IMU 融合的电子防抖工程方案

本文探讨了基于OpenCV光流和IMU融合的手持视频电子防抖方案。作者从实际工程经验出发,分析了纯光流和纯IMU方案的局限性,指出时间戳对齐和坐标系标定是关键挑战。文章详细介绍了融合滤波器的实现方法,推荐互补滤波替代卡尔曼滤波,并提出了动态调整融合系数的策略。在光流算法优化方面,建议采用网格化FAST特征点和前后向误差检测。最后分享了运动补偿裁剪策略和多线程流水线设计,强调在嵌入式设备上使用NEON指令优化性能。该方案通过精确的时间同步和传感器融合,有效解决了手持拍摄中的高频抖动问题。

ai技术增长的博客 250

Json to JObject转换的使用方法

Json to JObject转换的使用方法 Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和修改部分的数据而非反序列化全部. 二.创建JSON数组和对象 在进行Linq to JSON之前,首先要了解一下用于操作Linq to JSON的类...

滴水石穿 3681

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JSON TO JOBJECT转换的使用方法

在进行Linq to JSON之前,首先要了解一下用于操作Linq to JSON的类. 类名 说明 JObject 用于操作JSON对象 JArray 用语操作JSON数组 JValue 表示数组中的值 JProperty 表示对象中的属性,以"key/v...

weixin_30859423的博客 856

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C# JSON反序列化JObject转换错误:诊断、解决方案与实战

JSON作为现代应用数据交换的核心格式,其序列化与反序列化是软件开发中的基础操作。在C#生态中,Newtonsoft.Json(Json.NET)通过反射机制将JSON字符串映射到强类型对象,这一过程依赖于类型系统的严格匹配。当JSON数据结构与目标C#类定义不一致时——例如字段缺失、类型不兼容或命名规范不同——反序列化器会启动容错机制,将数据解析为动态的JObject容器而非预期类型,导致后续强制转换失败。这种机制虽保障了程序不崩溃,却引入了运行时类型安全风险。其技术价值在于平衡了静态类型语言的严谨性与外

weixin_33804582的博客 387

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

获取json对象中的值和key_c# Json的动态解析

Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和修改部分的数据而非反序列化全部.二.创建JSON数组和对象在进行Linq to JSON之前,首先要了解一下用于操作Linq to JSON的类.类名说明JObject用于操作JSON对象...

weixin_39528467的博客 1772

JSON-JObject

http://james.newtonking.com/json/help/index.html http://www.cnblogs.com/usharei/archive/2012/04/24/2467578.html Json.Net系列教程 4.Linq To JSON 2013-05-31 添加一个FAQ 一.Linq to JSON是用来干什么的? ...

weixin_34113237的博客 86

asp.net JObject 操作

一.Linq to JSON是用来干什么的?   Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和修改部分的数据而非反序列化全部. 二.创建JSON数组和对象 在进行Linq to JSON之前,首先要了解一下用于操作Linq to J...

weixin_33700350的博客 1397

C#使用newtonsoft库修改json串的节点信息

项目中遇到json串不规范的问题,多个相同的key值类型却不一样,导致无法正常实体化,所以需要修改json串,通过官方文档找到了解决方案,记录以下: string json = @"{ 'channel': { 'title': 'Star Wars', 'link': 'http://www.starwars.com', 'description': 'Star Wars blog.', 'obsolete': 'Obsolete value', 'item'.

yunxiaobaobei的博客 2473

Newtonsoft.Json的使用

(1)JObject对象: 字符串转JObject:JObject json = JObject.Parse(字符串); JObject转字符串:string 字符串= JsonConvert.SerializeObject(json); 增加:json["键"] = 值; 或 json.Add(new JProperty("键", 值)); 删除:json.R...

u013595395的博客 1706

Json的动态解析

Json的动态解析 原文:Json的动态解析 最近在项目中需要动态解析json,但解析json的方式有很多,如何合理的解析就是我们需要考虑的问题?比如Newtonsoft.Json.Linq下提供的JToken、JObject等,Newtonsoft.J...

weixin_30642267的博客 494

Json.Net系列教程 Linq To JSON

一.Linq to JSON是用来干什么的?   Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和修改部分的数据而非反序列化全部. 二.创建JSON数组和对象 在进行Linq to JSON之前,首先要了解一下用于操作Linq to JSON的类. 类名 说明 JObject 用于操作JSON对象 .

wvtjplh的专栏 277

native和static native区别

本文基于Hello JNI 如有疑惑,请看之前几篇文章。native 与 static nativejava中 public native String helloJni(); public native static String helloJniStatic();JNI中JNIEXPORT jstring JNICALL Java_com_test_git_jnidemo_Jni

forward 1万+
上一篇: C#判断文件是否被占用
下一篇: C/S架构系统的自动更新功能设计与实现(六)
acngiser
博客等级 码龄15年 118粉丝 214原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值