.Net_比对Json文件是否一致
简介
- 该方法用于比较两个Json文件是否完全一致,仅考虑内容
- 若两个文件中的内容只是顺序不一致,内容是一样的,那么也代表这两个文件是相等的
实现代码
- 调用
using CompareJsonFiles;Console.WriteLine("================= 输入信息 ===================");Console.WriteLine("请输入源Json文件路径:");
var sourcePath = Console.ReadLine();Console.WriteLine($"{Environment.NewLine}请输入目标Json文件路径:");
var targetPath = Console.ReadLine();Console.WriteLine($"{Environment.NewLine}您输入的源路径为:{sourcePath},目标路径为:{targetPath}");Console.WriteLine($"================= 输入信息 =================== {Environment.NewLine}");CompareJsonHelper.CompareJsonFiles(sourcePath?.Trim(), targetPath?.Trim());
- 实现
using Newtonsoft.Json.Linq;namespace CompareJsonFiles;/// <summary>
/// 比对Json文件的帮助类
/// </summary>
public static class CompareJsonHelper
{/// <summary>/// 比较两个JSON文件的内容/// </summary>/// <param name="sourcePath">源文件</param>/// <param name="targetPath">目标文件</param>public static void CompareJsonFiles(string? sourcePath, string? targetPath){if (!IsExistForJsonFile(sourcePath, targetPath)){return;}// 加载并解析JSON文件var json1 = JToken.Parse(File.ReadAllText(sourcePath));var json2 = JToken.Parse(File.ReadAllText(targetPath));// 标准化JSON结构var normalizedSourceJson = NormalizeJson(json1);var normalizedTargetJson = NormalizeJson(json2);// 比较JSON内容var differences = FindDifferences(normalizedSourceJson, normalizedTargetJson, string.Empty);// 输出差异if (differences.Count == 0){Console.WriteLine("======================== 两个文件内容一致!==============================");}else{Console.WriteLine("============================= 两个文件存在以下差异:=================================");foreach (var diff in differences){Console.WriteLine(diff);}}}/// <summary>/// 监测源文件和目标文件是不是Json文件/// </summary>/// <param name="sourcePath"></param>/// <param name="targetPath"></param>/// <returns></returns>private static bool IsExistForJsonFile(string? sourcePath, string? targetPath){if (string.IsNullOrWhiteSpace(sourcePath)){Console.WriteLine("错误信息:源文件路径不能为空");return false;}if (string.IsNullOrWhiteSpace(targetPath)){Console.WriteLine("错误信息:目标文件路径不能为空");return false;}if (!System.IO.File.Exists(sourcePath)){Console.WriteLine("错误信息:源文件不存在");return false;}if (!System.IO.File.Exists(targetPath)){Console.WriteLine("错误信息:目标文件不存在");return false;}if (Path.GetExtension(sourcePath) != ".json"){Console.WriteLine("错误信息:源文件不是Json文件");return false;}if (Path.GetExtension(targetPath) != ".json"){Console.WriteLine("错误信息:目标文件不是Json文件");return false;}return true;}/// <summary>/// 标准化JSON结构以便比较/// </summary>/// <param name="token"></param>/// <returns></returns>private static JToken NormalizeJson(JToken token){switch (token.Type){case JTokenType.Object:var sortedObject = new JObject();var properties = token.Children<JProperty>().ToList();properties.Sort((x, y) => string.Compare(x.Name, y.Name, StringComparison.Ordinal));foreach (var prop in properties){sortedObject.Add(prop.Name, NormalizeJson(prop.Value));}return sortedObject;case JTokenType.Array:var sortedArray = new JArray(token.Select(NormalizeJson).OrderBy(t => t.ToString()));return sortedArray;default:return token.DeepClone();}}/// <summary>/// 查找两个JSON之间的差异/// </summary>/// <param name="source"></param>/// <param name="target"></param>/// <param name="path"></param>/// <returns></returns>private static List<string> FindDifferences(JToken source, JToken target, string path){var differences = new List<string>();if (source.Type != target.Type){differences.Add($"路径 {path} 类型不同: {source.Type} 和 {target.Type}");return differences;}switch (source.Type){case JTokenType.Object:foreach (var property in ((JObject)source).Properties()){if (!((JObject)target).TryGetValue(property.Name, out JToken? tryTargetValue)){differences.Add($"路径 {path}.{property.Name} 在第二个文件中不存在");continue;}differences.AddRange(FindDifferences(property.Value, tryTargetValue, $"{path}.{property.Name}"));}foreach (var property in ((JObject)target).Properties()){if (!((JObject)source).TryGetValue(property.Name, out _)){differences.Add($"路径 {path}.{property.Name} 在第一个文件中不存在");}}break;case JTokenType.Array:var arraySource = source as JArray;var arrayTarget = target as JArray;for (var i = 0; i < Math.Max(arraySource?.Count ?? 0, arrayTarget?.Count ?? 0); i++){if (i >= arraySource?.Count || i >= arrayTarget?.Count){differences.Add($"路径 {path}[{i}] 数组长度不一致");continue;}differences.AddRange(FindDifferences(arraySource![i], arrayTarget![i], $"{path}[{i}]"));}break;default:if (!JToken.DeepEquals(source, target)){differences.Add($"路径 {path} 值不同: {source} 和 {target}");}break;}return differences;}
}
相关文章:
.Net_比对Json文件是否一致
简介 该方法用于比较两个Json文件是否完全一致,仅考虑内容若两个文件中的内容只是顺序不一致,内容是一样的,那么也代表这两个文件是相等的 实现代码 调用 using CompareJsonFiles;Console.WriteLine(" 输入信息 ");Console.WriteL…...
科研笔记:ARR 与 ACL rolling
1 ARR 介绍 ARR 提供 评审服务 —— 仅限评审 —— 对于提交的论文。评审不会针对特定会议/场所,但评审标准与传统会议的主会场长文或短文提交要求相同(如 ACL 或其他由 ACL 主办的重要会议) 2 提交论文进行 ARR 评审 提交截止日期 每两个…...
【2024】Camunda常用功能基本详细介绍和使用-上 (1)
这里写目录标题 前言一、 介绍基本概念介绍1.BPMN2.Form3.DMN 二、Camunda使用1、下载安装1.1、camunda-modeler:BPMN绘画工具1.2、camunda-bpm-run:web端控制页面 2、创建流程2.1、部署一个基础流程2.2、添加用户任务2.2.1、绑定表单2.2.1.1、Generated…...
用人话讲计算机:Python篇!(十二)正则运算+re模块
目录 一、正则表达式 (1)什么是正则表达式 (2)它的结构及使用 示例: 1.字符 . (←这里有个小点哦) 2.字符 | 3.字符 [ ] 4.字符^ 5.字符\d (3)补充ÿ…...
使用create-react-app创建工程时报错处理
1:全局安装create-react-app npm install -g create-react-app 2:切换到项目要创建的目录下 cd /d G:\vsCode_project\react 3:使用脚手架命令创建工程 create-react-app 项目名 项目名命名要遵循npm包命名规范:数字、小写字…...
C# 探险之旅:第三十五节 - 类型class之抽象类 (Abstract Class) 和 抽象方法 (Abstract Method)
👋 嗨,勇敢的探险家们!欢迎再次踏上C#的神秘之旅。今天,我们要进入一片既神秘又充满无限可能的领域——抽象类与抽象函数的奇幻森林。想象一下,你是一名勇敢的骑士,要在这片森林里寻找传说中的“编程之宝”…...
qt-C++笔记之父类窗口、父类控件、对象树的关系
qt-C笔记之父类窗口、父类控件、对象树的关系 code review! 参考笔记 1.qt-C笔记之父类窗口、父类控件、对象树的关系 2.qt-C笔记之继承自 QWidget和继承自QObject 并通过 getWidget() 显示窗口或控件时的区别和原理 3.qt-C笔记之自定义类继承自 QObject 与 QWidget 及开发方式…...
Cisco Packet Tarcer配置计网实验笔记
文章目录 概要整体架构流程网络设备互连基础拓扑图拓扑说明配置步骤 RIP/OSPF混合路由拓扑图拓扑说明配置步骤 BGP协议拓扑图拓扑说明配置步骤 ACL访问控制拓扑图拓扑说明配置步骤 HSRP冗余网关拓扑图拓扑说明配置步骤 小结 概要 一些环境配置笔记 整体架构流程 网络设备互连…...
使用torch模拟 BMM int8量化计算。
使用torch模型BMM int8计算。 模拟:BMM->softmax->BMM 计算流程 import torch import numpy as np torch.manual_seed(777) def int8_quantize_per_token(x: torch.Tensor, axis: int -1, attnsFalse):if x.dtype ! torch.float32:x x.type(torch.float32)…...
【FreeMarker】实现生成Controller根据模板勾选的内容查询
需求:根据模板列表勾选的字段查询列表数据 FreeMarker代码: /*** 分页列表查询** param ${entityName?uncap_first}* param pageNo* param pageSize* param req* return*///AutoLog(value "${tableVo.ftlDescription}-分页列表查询")ApiOp…...
深入理解 XPath:XML 和 HTML 文档的利器
XPath(XML Path Language)是一种用于在 XML 和 HTML 文档中定位节点的语言。它常用于 XML 解析、Web 数据抓取(如 Selenium 或 Scrapy)以及配置文件解析。本文将带你深入了解 XPath 的语法、功能及其在实际中的应用。 目录 一、什…...
DDR5 中的数据反馈判决均衡(DFE):全面解析与展望
目录 一、引言二、DFE原理三、DFE架构四、实现方案五、测试方法六、DFE效果七、成本与收益八、具体应用九、技术发展趋势十、参考文献 一、引言 DDR5 作为新一代内存标准,其中的数据反馈判决均衡(DFE)技术更是引人注目。DFE即判决反馈均衡&a…...
Axure高保真数据可视化大屏图表组件库
推出了一款高保真数据可视化大屏图表组件库,旨在为用户提供丰富的图表类型,使数据呈现更加直观、生动。本文将详细介绍该组件库中的各类图表元件,包括面积图、折线图、柱状图、条形图、圆环图、雷达图、仪表图以及综合类图表,以满…...
100个问题学 langchain 入门 (1/10)
100个问题学 langchain 入门 (1/10) 文章目录 100个问题学 langchain 入门 (1/10)前言**问题 1** 什么是 langchain,解决什么问题?**问题 2** LangChain 的核心组件有哪些?请列举并简要说明每个组件的作用。**问题 3** 在 LangChain 中&#…...
0001.基于springmvc简易酒店管理系统后台
一.系统架构 springmvcjsplayuimysql 二.功能特性 简单易学习,虽然版本比较老但是部署方便,tomcat环境即可启用;代码简洁,前后端代码提供可统一学习;祝愿您能成尽快为一位合格的程序员,愿世界没有BUG; …...
每日一题 326. 3 的幂
326. 3 的幂 简单 class Solution { public:bool isPowerOfThree(int n) {while(n > 3){if(n % 3 0){n n/3;}else{return false;}}return n 1;} };...
解码数据有序之道——常见排序算法总结
本文整理了常见的排序算法,采用c编码,并对其时间复杂度作以了分析。 1. 冒泡排序(Bubble Sort) 实现思路: 从数组的第一个元素开始,依次比较相邻的两个元素。如果当前元素大于下一个元素,则交…...
C语言实现图片文件的复制
在C语言中,直接处理图片文件(如JPEG、PNG等)的复制,通常涉及到文件I/O操作。这些图片文件是二进制文件,因此需要使用二进制模式读取和写入文件。 图片文件复制代码: #include <stdio.h> #include&l…...
一、windows上配置ninja环境
Ninja是Google的一名程序员推出的注重速度的构建工具,一般在Unix/Linux上的程序通过make/makefile来构建编译,而Ninja通过将编译任务并行组织,大大提高了构建速度。下面介绍了windows上配置Ninja环境。 1.下载Ninja ninja官网地址࿱…...
我们来编程 -- win11多jdk版本切换
题记 售前的酒喝到位了调研需求及文档整理出来了开发要入场了,真惨啊!年底了,手里活干的好好的,因为flyback在项目地,硬是被安排进来了拥抱变化,我呸…不得不切换系统,构建代码,一股…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
