C# - JSON Schema validation

news2024/11/26 23:26:51

C# - JSON Schema validation

  • 引言
  • 如何生成 C# 类 JSON Schema
    • 利用在线工具
    • 利用 Visual Studio
    • 利用 NJsonSchema
  • 验证 JSON Schema
    • 针对 JSON Schema 字符串
    • 针对 C# 类 Schema

引言

针对 API 测试,我们需要验证 Response 中的一些字段类型,是否缺省等,现在有一些开源的插件就可以实现,很方便。

之前 Java API 测试 《 REST Assured 系列汇总 》有介绍 REST Assured JSON Schema 验证,可以参考下面三篇文章:

REST Assured 54 - What Is JSON Schema?

REST Assured 55 - JSON Schema Validation In Rest Assured

REST Assured 56 - JSON Schema Validation Without Rest Assured

今天介绍 C# API 测试有关 JSON Schema validation,怎么将 JSON 生成 C# 类文件,以及如何验证 JSON Schema。

如何生成 C# 类 JSON Schema

主要有三种方式将 JSON response 自动生成 C# 类 JSON Schema,各有特色。

利用在线工具

用在线工具 quicktype 生成最方便了, 还可以进行一些设置。

例如:简单的一个 JSON

{
  "ID": "1002",
  "Name": "ABCD",
  "City": "city",
  "Country": "USA",
  "hobby": ["reading", "travel"]
}

在这里插入图片描述

利用 Visual Studio

Visual Studio 有个 “Paste Special” 功能用来创建 JSON c# classes.
Visual Studio – -> Edit — > Paste Special

具体步骤如下:

  1. 创建一个 C# 文件
  2. copy 下面 JSON 内容到剪贴板
{
  "ID": "1002",
  "Name": "ABCD",
  "City": "city",
  "Country": "USA",
  "hobby": ["reading", "travel"]
}
  1. 打开步骤 #1 中创建的 C# 文件,然后打开菜单 Visual Studio --> Edit – > Paste Special–> Past JSON As Classes
    在这里插入图片描述
  2. 在C# 文件中就自动生成了下面这个类
    我们需要做一些改动,例如类名,加一些 Attributs
 public class Rootobject
    {
        public string ID { get; set; }
        public string Name { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
        public string[] hobby { get; set; }
    }

利用 NJsonSchema

NJsonSchema 是一个 .NET library 用来读,生成,验证 JSON Schema. 它提供了基本的 APIs,可以用来从一个 JSON Schema 生成 C# 类,或生成 TypeScript 类,或接口。更多细节可参考《 Autogenerate C# Class using JSON string or JSON Schema 》

  1. 首先需要装下面这个 NuGet package.在这里插入图片描述
  2. 准备一个 json 文件,注意将属性设置为 Copy always
    在这里插入图片描述
  3. 创建一个 Generator 文件
    注意命名空间 using JsonSchema = NJsonSchema.JsonSchema;
using NJsonSchema.CodeGeneration.CSharp;
using JsonSchema = NJsonSchema.JsonSchema;

namespace ConsoleApp
{
    public class Generator
    {
        static void Main(string[] args)
        {
            string json = File.ReadAllText("js.json");
            var schemaFromFile = JsonSchema.FromSampleJson(json);
            var classGenerator = new CSharpGenerator(schemaFromFile, new CSharpGeneratorSettings
            {
                ClassStyle = CSharpClassStyle.Poco,
            });
            var codeFile = classGenerator.GenerateFile();
            File.WriteAllText("JSONSchemaClass.cs", codeFile);

        }
    }
}
  1. 运行一下,看看生成的 JSONSchemaClass.cs 文件
    注意路径在 bin 目录下。
//----------------------
// <auto-generated>
//     Generated using the NJsonSchema v10.8.0.0 (Newtonsoft.Json v9.0.0.0) (http://NJsonSchema.org)
// </auto-generated>
//----------------------


namespace MyNamespace
{
    #pragma warning disable // Disable all warnings

    [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.8.0.0 (Newtonsoft.Json v9.0.0.0)")]
    public partial class Anonymous
    {
        [Newtonsoft.Json.JsonProperty("ID", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
        public string ID { get; set; }

        [Newtonsoft.Json.JsonProperty("Name", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
        public string Name { get; set; }

        [Newtonsoft.Json.JsonProperty("City", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
        public string City { get; set; }

        [Newtonsoft.Json.JsonProperty("Country", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
        public string Country { get; set; }

        [Newtonsoft.Json.JsonProperty("hobby", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
        public System.Collections.Generic.ICollection<string> Hobby { get; set; }



        private System.Collections.Generic.IDictionary<string, object> _additionalProperties;

        [Newtonsoft.Json.JsonExtensionData]
        public System.Collections.Generic.IDictionary<string, object> AdditionalProperties
        {
            get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary<string, object>()); }
            set { _additionalProperties = value; }
        }

    }
}

验证 JSON Schema

首先需要安装 NJsonSchema NuGet 包
在这里插入图片描述

针对 JSON Schema 字符串

可以参考这遍文章《 C# JSON Schema validation 》这个例子还能运用在异步代码上。

namespace ConsoleApp
{
    using NJsonSchema;
    using System;
    using System.Threading.Tasks;
 
    class ValidateJSONSchema
    {
        static async Task Main()
        {
 
            var jsonSchema = @"
                {
                    ""type"": ""object"",
                    ""properties"": {
                        ""name"": {
                            ""type"": ""string""
                        },
                        ""age"": {
                            ""type"": ""integer"",
                            ""minimum"": 0
                        },
                        ""isMarried"": {
                            ""type"": ""boolean""
                        }
                    }
                 }
            ";
 
            var jsonDataValid = @"
                {
                    ""name"": ""Jay"",
                    ""age"": 20,
                    ""isMarried"": true
                }
            ";
 
            var jsonDataInvalid = @"
                {
                    ""name"": ""Jay"",
                    ""age"": ""20"",
                    ""isMarried"": ""true""
                }
            ";
 
            var schema = await JsonSchema.FromJsonAsync(jsonSchema);
 
            var errorsForValidJson = schema.Validate(jsonDataValid);
            var errorsForInvalidJson = schema.Validate(jsonDataInvalid);
 
            Console.WriteLine("valid errors:");
            foreach (var error in errorsForValidJson) Console.WriteLine(error);
 
            Console.WriteLine("invalid errors:");
            foreach (var error in errorsForInvalidJson) Console.WriteLine(error);
 
        }
    }
}

运行结果如下:

在这里插入图片描述

针对 C# 类 Schema

利用前面介绍的方法,将生成的 C# 类 JSON Schema 文件添加到项目中。

using Newtonsoft.Json;

namespace ConsoleApp
{
    public class JSONSchema
    {
        [JsonProperty("ID", Required = Required.Always)]
        public string Id { get; set; }

        [JsonProperty("Name", Required = Required.Always)]
        public string Name { get; set; }

        [JsonProperty("City", Required = Required.Always)]
        public string City { get; set; }

        [JsonProperty("Country", Required = Required.Always)]
        public string Country { get; set; }

        [JsonProperty("hobby", Required = Required.Always)]
        public List<string> Hobby { get; set; }

       }
}

在这里插入图片描述

利用反射机制将 C# 类解析成 JsonSchema
string schemaName = “JSONSchema”;
Type type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(x => x.Name == schemaName);
var schema = JsonSchema.FromType(type);

using Newtonsoft.Json.Linq;
using NJsonSchema;
using System.Reflection;

namespace ConsoleApp
{
    public class ValidateJSONSchema
    {

    static void Main(string[] args)
        {
            //string data = "";
            string jsonDataValid = @"
               {
                  ""ID"": ""1002"",
                  ""Name"": ""ABCD"",
                  ""City"": ""city"",
                  ""Country"": ""USA"",
                  ""hobby"": [""reading"", ""travel""]
                }
            ";
            string schemaName = "JSONSchema";
            Type type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(x => x.Name == schemaName);
            if (type == null)
                throw new Exception($"Schema {schemaName} not found");

            JToken Data = JToken.Parse(jsonDataValid);

            var schema = Data.Type == JTokenType.Array ?
             JsonSchema.FromType(typeof(List<>).MakeGenericType(new[] { type })) :
             JsonSchema.FromType(type);

            var errors = schema.Validate(jsonDataValid);
            Console.WriteLine(errors.Count.ToString());
            Console.WriteLine(string.Join(System.Environment.NewLine, errors));
            
        }
    }
}

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

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

相关文章

Linux操作系统精讲之高级IO

代码在&#xff1a; https://github.com/sjmshsh/System-Call-Learn 通过阅读本篇文章&#xff0c;你可以收获&#xff1a; 理解五种IO模型的基本概念&#xff0c;重点是IO多路转接掌握select&#xff0c;poll&#xff0c;epoll系统调用接口并实现简易的TCP服务器理解epoll的…

10、创建不同类型的工程

文章目录10、创建不同类型的模块10.1 创建Java模块10.2 创建Java Web模块1 IDEA中配置Tomcat2 创建Web工程3 配置Web工程并运行4 乱码的解决10.3 创建Maven Java模块1 Maven的介绍2 Maven的配置3 Maven Java工程的创建4 编写代码及测试10.4 创建Maven Web模块1 创建Maven的Web模…

java基础语法——断点调试与数据加密(基础语法练习学习)

目录 Eclipse的断点调试 基础语法的练习 Eclipse的断点调试 作用&#xff1a;查看程序执行流程和调试程序 断点&#xff1a; 就是一个标记,就是我们经常用到的debug&#xff08;检查程序错误&#xff0c;我们用到的是debug as&#xff09; A–哪里加?—— 在实际的程序行号…

Knowledge-based-BERT(二)

多种预训练任务解决NLP处理SMILES的多种弊端&#xff0c;代码&#xff1a;Knowledge-based-BERT&#xff0c;原文&#xff1a;Knowledge-based BERT: a method to extract molecular features like computational chemists&#xff0c;代码解析继续K_BERT_WCL_pretrain。模型框…

Java多线程 - 线程安全和线程同步解决线程安全问题

文章目录线程安全问题线程同步方式一: 同步代码块方式二: 同步方法方式三: Lock锁线程安全问题 线程安全问题指的是: 多个线程同时操作同一个共享资源的时候可能会出现业务安全问题&#xff0c;称为线程安全问题。 举例: 取钱模型演示 需求&#xff1a;小明和小红是一对夫妻&am…

建单向链表-C语言实现

任务描述 本关需要你建立一个带头结点的单向链表。 相关知识 什么是链表?链表和二叉树是C语言数据结构的基础和核心。 链表有多种形式,它可以是单链接的或者双链接的,可以是已排序的或未排序的,可以是循环的或非循环的。 本关让我们来学习单链表。 单链表 单向链表(单…

XC-16 SpringSecurity Oauth2 JWT

SpringSecurityOauth2用户认证需求分析用户认证与授权单点登录需求第三方认证需求用户认证技术方案单点登录技术方案Oauth2认证Oauth2认证流程2.2.2Oauth2在本项目中的应用SpringSecurity Oauth2认证解决方案SpringSecurityOauth2研目标搭建认证服务器导入基础工程创建数据库Oa…

一起自学SLAM算法:9.2 LSD-SLAM算法

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 下面将从原理分析、源码解读和安装与运行这3个方面展开讲解LSD-SLAM算法。 9.2.1 LSD-SLAM原理分析 前面已经说过&#xff0c;LSD-SLAM算法是直接法的典型代表。因此在下面的分析中&#xff0c;首先介绍一下直…

学习笔记:Java 并发编程④

若文章内容或图片失效&#xff0c;请留言反馈。 部分素材来自网络&#xff0c;若不小心影响到您的利益&#xff0c;请联系博主删除。 视频链接&#xff1a;https://www.bilibili.com/video/av81461839配套资料&#xff1a;https://pan.baidu.com/s/1lSDty6-hzCWTXFYuqThRPw&am…

CSS语法格式与三种引入方式

文章目录第一章——CSS简介1.1 CSS语法格式1.2 CSS 位置1.3 CSS引入方式1.3.1.行内样式表&#xff08;内联样式表&#xff09;1.3.2 外部样式表1.3.3 内部样式表第一章——CSS简介 1.1 CSS语法格式 CSS 规则由两个主要的部分构成&#xff1a;选择器以及一条或多条声明。 选择…

C语言全局变量和局部变量

局部变量定义在函数内部的变量称为局部变量&#xff08;Local Variable&#xff09;&#xff0c;它的作用域仅限于函数内部&#xff0c; 离开该函数后就是无效的&#xff0c;再使用就会报错。例如&#xff1a;intf1(int a){ int b,c;//a,b,c仅在函数f1()内有效 return abc; } i…

各种CV领域 Attention (原理+代码大全)

人类在处理信息时&#xff0c;天然会过滤掉不太关注的信息&#xff0c;着重于感兴趣信息&#xff0c;于是将这种处理信息的机制称为注意力机制。 注意力机制分类&#xff1a;软注意力机制&#xff08;全局注意&#xff09;、硬注意力机制&#xff08;局部注意&#xff09;、和…

打工人必知必会(三)——经济补偿金和赔偿金的那些事

目录 参考 一、经济补偿金&赔偿金-用人单位承担赔偿责任 1、月平均工资是税前还是税后工资&#xff1f; 3、经济补偿金是否要交个人所得税&#xff1f;如何交&#xff1f; 二、劳动者承担赔偿责任 三、劳动者需要特别注意 参考 《HR全程法律顾问&#xff1a;企业人力资…

Day12 XML配置AOP

1 前言前文我们已经介绍了AOP概念Day11 AOP介绍&#xff0c;并将其总结如下&#xff1a;2 AOP 标签和expression表达式学习<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:x…

3.4只读存储器ROM

文章目录一、引子二、介绍1.MROM2.PROM3.EPROM4.Flash Memory5.SSD三、运行过程四、回顾一、引子 这一小节&#xff0c;我们学习只读存储器ROM。 上一小节&#xff0c;学习了两种RAM芯片&#xff0c;分别是SRAM和DRAM。详情请戳&#xff1a;3.3Sram和Dram RAM芯片可以支持随…

Pygame创建界面

今天开始对Python的外置包pygame进行学习&#xff0c;pygame是Python的游戏包&#xff0c;使用该包可以设计一些简单的小游戏。 前言 利用Python外置包创建一个简单界面&#xff0c;首先需要下载Python外置包pygame 使用语句&#xff1a;pip install pygame Display模块 创建…

红黑树知识点回顾

Rudolf Bayer 于1978年发明红黑树&#xff0c;在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来&#xff0c;在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。 红黑树具有良好的效率&#xff0c;它可在近似O(logN) 时间复杂度下完成插入、删除、…

实验五、任意N进制异步计数器设计

实验五 任意N进制异步计数器设计 实验目的 掌握任意N进制异步计数器设计的方法。 实验要求 一人一组&#xff0c;独立上机。在电脑上利用Multisim软件完成实验内容。 实验内容 说明任意N进制异步计数器的构成方法 设计过程 集成计数器一般都设有清零端和置数输入端&#xff…

3.7动态规划--图像压缩

3.6多边形游戏&#xff0c;多边形最优三角剖分类似&#xff0c;仅仅是最优子结构的性质不同&#xff0c;这个多边形游戏更加具有一般性。不想看了&#xff0c;跳过。 写在前面 明确数组含义&#xff1a; l: l[i]存放第i段长度, 表中各项均为8位长&#xff0c;限制了相同位数…

ElasticSearch - RestClient操作ES基本操作

目录 什么是RestClient hotel数据结构分析 初始化RestClient 创建索引库 删除索引库 判断索引库是否存在 小结 新增文档 查询文档 更新文档 删除文档 批量导入文档 小结 什么是RestClient ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES这些客户端的本质…