用于验证 JSON 数据是否符合指定 JSON Schema 的函数,并使用断言进行验证结果

PYTHON 用于验证 JSON 数据是否符合指定 JSON Schema 的函数,并使用断言进行验证结果

from jsonschema import validate, draft7_format_checker, SchemaError, ValidationErrordef jsonschema_assert(code, msg, schema, jsonSchema):assert code == codeassert msg == msgtry:validate(instance=jsonSchema, schema=schema, format_checker=draft7_format_checker)except SchemaError as e:return 1, f"验证模式schema出错:\n出错位置:{'--> '.join([i for i in e.path])}\n提示信息:{e.message}"except ValidationError as e:return 1, f"json数据不符合schema规定:\n出错字段:{'-->'.join([i for i in e.path])}\n提示信息:{e.message}"else:return 0, "success!"

这段代码是一个用于验证 JSON 数据是否符合指定 JSON Schema 的函数。下面是对代码的解析:

  1. from jsonschema import validate, draft7_format_checker, SchemaError, ValidationError:导入所需的模块和异常类。

  2. def jsonschema_assert(code, msg, schema, jsonSchema)::定义了一个名为 jsonschema_assert 的函数,它接受四个参数:codemsgschemajsonSchema

    • code:表示代码的一个值,但此处实际上没有使用该参数,因为代码中的 assert 语句总是返回 True
    • msg:表示消息的一个值,但此处实际上没有使用该参数,因为代码中的 assert 语句总是返回 True
    • schema:表示 JSON Schema 的定义,用于验证 JSON 数据的结构和属性。
    • jsonSchema:表示要验证的 JSON 数据。
  3. assert code == codeassert msg == msg:这两行代码实际上没有实际意义,因为它们只是对传入的 codemsg 进行了自我比较,始终会返回 True

  4. try::开始一个 try 块,捕获可能发生的异常。

  5. validate(instance=jsonSchema, schema=schema, format_checker=draft7_format_checker):使用 jsonschema 模块的 validate 函数验证给定的 JSON 数据 jsonSchema 是否符合指定的 JSON Schema schemaformat_checker=draft7_format_checker 表示使用 JSON Schema Draft 7 格式的检查器。

  6. except SchemaError as e::捕获 SchemaError 异常,如果 JSON Schema 的定义有错误,则会抛出该异常。

    • 返回一个元组,第一个元素是 1,表示验证出错;第二个元素是一个错误消息,包含出错位置和提示信息。
  7. except ValidationError as e::捕获 ValidationError 异常,如果 JSON 数据不符合 JSON Schema 的规定,则会抛出该异常。

    • 返回一个元组,第一个元素是 1,表示验证出错;第二个元素是一个错误消息,包含出错字段和提示信息。
  8. else::如果没有抛出异常,则执行这个分支。

    • 返回一个元组,第一个元素是 0,表示验证成功;第二个元素是一个字符串,内容为 “success!”。

总结:该函数的目的是验证给定的 JSON 数据是否符合指定的 JSON Schema,返回一个元组,第一个元素表示验证结果(0 表示成功,1 表示出错),第二个元素包含了相关的错误信息或成功消息。
以下是对代码的解析和优化封装:

from jsonschema import validate, draft7_format_checker, SchemaError, ValidationErrordef jsonschema_assert(code, msg, schema, json_data):"""用于验证 JSON 数据是否符合指定 JSON Schema 的函数,并使用断言进行验证结果:param code:返回数据中code表示代码的一个值,:param msg:返回数据中msg表示消息的一个值:param schema:表示 JSON Schema 的定义,用于验证 JSON 数据的结构和属性。:param json_data:验证的 JSON 数据:return: 返回相应的错误信息"""try:validate(instance=json_data, schema=schema, format_checker=draft7_format_checker)except SchemaError as e:return 1, f"验证模式schema出错:\n出错位置:{'--> '.join([i for i in e.path])}\n提示信息:{e.message}"except ValidationError as e:return 1, f"json数据不符合schema规定:\n出错字段:{'-->'.join([i for i in e.path])}\n提示信息:{e.message}"else:if code is not None and code != code:return 1, "code不匹配"if msg is not None and msg != msg:return 1, "msg不匹配"return 0, "success!"

解析和优化封装的内容如下:
解析:

  1. 首先,代码导入了 jsonschema 模块中的一些必要组件,包括 validate 函数、draft7_format_checker 格式检查器以及 SchemaErrorValidationError 异常类。

  2. jsonschema_assert 函数接受四个参数:codemsgschemajson_data。其中,codemsg 是用于匹配的额外参数,schema 是用于验证的 JSON 模式,json_data 是要验证的 JSON 数据。

  3. 函数使用 validate 函数来验证 json_data 是否符合 schema。如果验证失败,函数会捕获 SchemaErrorValidationError 异常,并返回相应的错误信息。

  4. 如果 schema 验证出错,函数会返回一个元组,第一个元素为 1,表示验证失败;第二个元素为错误信息,包括出错位置和提示信息。

  5. 如果 schema 验证通过,则会继续进行额外的匹配。如果给定的 codemsg 不为空且不匹配实际的 codemsg,函数会返回一个元组,第一个元素为 1,表示验证失败;第二个元素为相应的错误信息。

  6. 如果所有的验证都通过,函数会返回一个元组,第一个元素为 0,表示验证成功;第二个元素为 “success!”,表示成功的提示信息。
    优化部分:

  7. 移除了原代码中多余的 assert 语句,因为它们没有实际作用。

  8. 将参数 jsonSchema 改为更常见的命名 json_data,以更好地描述参数含义。

  9. 优化了返回结果的逻辑,不再要求必须传入 codemsg 参数,并且增加了对它们的验证。如果传入了 codemsg,并且它们不匹配实际值,则返回错误结果。

  10. 将函数返回结果的格式改为一个元组 (status, message),其中 status 为 0 表示成功,为 1 表示失败,message 为相应的提示信息。

还可以这样优化,具体根据实际情况进行优化:


from jsonschema import validate, draft7_format_checker, SchemaError, ValidationErrordef jsonschema_assert(code, msg, schema, json_data):"""用于验证 JSON 数据是否符合指定 JSON Schema 的函数,并使用断言进行验证结果:param code:返回数据中code表示代码的一个值,:param msg:返回数据中msg表示消息的一个值:param schema:表示 JSON Schema 的定义,用于验证 JSON 数据的结构和属性。:param json_data:验证的 JSON 数据:return: 返回相应的错误信息"""expected_code = "000000"expected_msg = "ok"assert code == expected_code, f"Expected code: {expected_code}, Actual code: {code}"assert msg == expected_msg, f"Expected message: {expected_msg}, Actual message: {msg}"try:validate(instance=json_data, schema=schema, format_checker=draft7_format_checker)except (SchemaError, ValidationError) as e:error_location = ' --> '.join([str(i) for i in e.path])error_message = e.message if hasattr(e, 'message') else str(e)return 1, f"Validation error:\nError location: {error_location}\nError message: {error_message}"else:if code is not None and code != expected_code:return 1, "code不匹配"elif msg is not None and msg != expected_msg:return 1, "msg不匹配"return 0, "success!"

这样优化后的函数可以更好地验证 JSON 数据是否符合指定的 JSON Schema,并提供更清晰的错误提示。你可以根据具体情况使用返回结果来进行后续处理。希望这样解析和优化封装能满足你的需求,如果有任何进一步的问题,请随时提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

资深测试总结,自动化测试-JSON+YAML+CSV+Excel数据驱动(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 数据驱动 在自动…

【Linux】udp服务器实现大型网络聊天室

udp终结篇~ 文章目录 前言一、udp服务器实现大型网络聊天室总结 前言 根据上一篇文章中对于英汉互译和远程操作的两个小功能大家应该已经学会了,我们的目的是让大家可以深刻的理解udp服务器所需要的接口已经实现的简单步骤,下面我们开始实现网络聊天室。…

微信小程序custom-tab-bar

微信小程序自定义tab-bar。 tab-bar使用tdesign中的t-tab-bar 1 在项目下新建custom-tab-bar文件夹&#xff0c;新建index 组件。 1.1 index.wxml中增加t-tab-bar <t-tab-bar value"{{value}}" bindchange"onChange" theme"tag" split&…

STM32单片机语音识别台灯控制系统人检测亮度调节

实践制作DIY- GC00156-语音识别台灯控制系统 一、功能说明&#xff1a; 基于STM32单片机设计-语音识别台灯控制系统 二、功能说明&#xff1a; 电路&#xff1a;STM32F103C系列最小系统串口语音识别模块LED灯板1个红外传感器 1.任何时候没有人则关闭灯。有人可以自动打开灯。…

Python物联网开发-Python_Socket通信开发-Python与Tcp协议物联网设备通信-Socket客户端

一、前言 Python在物联网开发中的重要愈来愈重&#xff0c;因此&#xff0c;掌握Python语言与物联网设备之间的通信就显得尤为重要&#xff0c;可以通过编写Python程序实现获取物联网设备的传感器数值并可以更改物联网设备上的执行器状态。 二、程序实现 首先&#xff0c;当使…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 一)

初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在学习ArkTS语言之前&#xff0c;建议开发者具备TS语…

LeetCode解题记录(一)

1、两数之和 题目描述&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 示例 1&#xff1a;输入&#xff1a;nums [2,7,11,15], target 9 输出&#xff1…

LangChain(3)对话缓存方式 Conversational Memory

LLM 默认是无状态的&#xff0c;即询问当前的问题与上下文无关&#xff0c;当我们需要将多轮对话信息给到LLM 时&#xff0c;就需要使用缓存Memory。缓存方式有多种。 from langchain import OpenAI from langchain.chains import ConversationChain# first initialize the la…

Linux内核的任务:

硬件与软件之间的中间层&#xff1a;内核在技术层面上充当硬件和软件之间的中间层&#xff0c;负责将应用程序的请求传递给硬件&#xff0c;并处理硬件设备和组件的寻址和操作。 应用程序的接口&#xff1a;对于应用程序来说&#xff0c;内核是它们与硬件之间的接口。应用程序通…

抓 https 报文新方案 -Magisk+LSPosed,来试试吧

关于如何抓取Android端https报文&#xff0c;在之前一篇文章中有介绍可以通过VitualXposedJustTrustMe模块禁用SSL验证&#xff0c;这样可以抓取到https&#xff0c;还是有一些同学反馈以下的一些问题&#xff1a; App在低版本的Android上不兼容&#xff0c;需要用高版本的And…

uniapp 集成七牛云,上传图片

1 创建项目 我是可视化创建项目的 &#xff0c;cli创建的项目可以直接使用npm安装七牛云。 2 拷贝qiniuUploader.js到项目&#xff0c;下面的回复 放了qiniuUploader.js百度云链接。 3 在需要使用qiniuUploader的vue文件 引入。 4 相册选择照片&#xff0c;或者拍照后&#xff…

视频问答新增或修改视频问答

通过问答id新增或修改视频问答题目 新增或修改视频问答 图3&#xff1a;视频问答功能&#xff08;观看效果&#xff09; 图4&#xff1a;视频问答功能&#xff08;观看效果&#xff09; 图5&#xff1a;视频问答功能&#xff08;观看效果&#xff09; 单元测试 Testpublic voi…

zabbix 6.0 监控LNPM环境

这里的LNPM是指Linux&#xff0c;Nginx,php-fpm和Mysql.具体版本如下。 Linux : centos7.9Nginx: 1.22.1php-fpm:7.4Mysql: 8.0 一、centos7.9 编译安装Nginx 为了弄清楚Nginx各种配置&#xff0c;我们采用编译安装的形式部署Nginx。 1.下载安装包 首先下载Nginx软件包&am…

oracle unpivot用法

Oracle UNPIVOT函数是将列旋转为行的一种方式。UNPIVOT函数可以将多个列转换为对应的行&#xff0c;以便进行聚合或插入操作。UNPIVOT函数可以将多个列转换为对应的行&#xff0c;以便进行聚合或插入操作。下面是使用UNPIVOT函数的示例&#xff1a; 假设我们有一个表&#xff…

为什么媒体和创意工作者更喜欢 Splashtop 进行远程访问

在当今快速发展的数字环境中&#xff0c;可靠的远程访问已成为全球媒体和创意工作者不可或缺的工具。 远程访问让创意工作者不再受传统办公空间边界的限制&#xff0c;完全实现了随时随地办公。无论是实时剪辑、高分辨率渲染还是其他创意任务&#xff0c;创意工作者对高性能远…

​LeetCode解法汇总874. 模拟行走机器人

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 机器人在一个无限大小的 XY 网格平面上行走&#xff0c;从点 (0, 0) 处开始出发…

ENSP实验四:搭建VPN(GRE,配置安全策略)

首先分析一下数据的流向&#xff1a; PC1->PC2 1、FW1&#xff1a;trust->dmz 【192.168.1.1->192.168.2.1 ICMP】 2、AR1->AR2&#xff1a;【202.1.1.1->202.1.3.1|GRE|192.168.1.1->192.168.2.1 icmp】 3、FW2&#xff1a; ①untrust->local …

kotlin中使用Room数据库(包含升降级崩溃处理)

目录 1.导入依赖库 2.数据实体类 3.数据访问对象 (DAO) 4.数据库类 5.调用DAO里面的“增、删、改、查”方法 6.数据库升降级处理 升级&#xff08;保存数据库历史数据&#xff09;&#xff1a; 升级&#xff08;不保存数据库历史数据&#xff09;&#xff1a; 降级&…

SpringCloud学习路线(1)—— 从头开始的微服务

一、服务架构的历史 现有的服务框架&#xff1a; 单体架构 概念&#xff1a; 将业务所有功能集中在一个项目中开发&#xff0c;打包部署优点&#xff1a; 架构简单&#xff0c;部署成本低缺陷&#xff1a; 耦合度高 分布式架构 概念&#xff1a; 根据业务功能对系统进行拆分&a…

laravel门面实现原理之源码分析

文章目录 场景总结源码分析 场景 最近待业&#xff0c;重新翻看laravel源码, Route::get注册路由&#xff0c;那Route类并没有get方法&#xff0c;那这行代码究竟执行了什么呢? 总结 Route::get 会调到父类的魔术方法__callStatic 第一步: getFacadeRoot 从容器中获取名称是ro…