首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Newtonsoft.Json验证:为属性强制使用一组特定的值

基础概念

Newtonsoft.Json(也称为Json.NET)是一个高性能的JSON框架,用于.NET环境。它提供了创建、解析、序列化和反序列化JSON数据的功能。在Newtonsoft.Json中,可以通过使用特性(Attributes)来为属性强制使用一组特定的值。

相关优势

  1. 类型安全:通过特性可以确保属性值只能是预定义的集合中的一个,从而提高代码的健壮性。
  2. 易于维护:如果需要更改允许的值集合,只需修改特性定义,而不需要修改大量的代码逻辑。
  3. 清晰的错误信息:当尝试设置不允许的值时,可以提供清晰的错误信息,便于调试。

类型

在Newtonsoft.Json中,可以使用JsonConverter来自定义序列化和反序列化的行为,或者使用特性如JsonProperty结合自定义验证逻辑来实现对属性值的限制。

应用场景

当需要确保某个JSON属性的值只能是预定义集合中的一个时,例如枚举类型、状态码等。

遇到的问题及解决方法

假设我们有一个类User,其中有一个属性Status,我们希望这个属性只能是"active""inactive""pending"中的一个。

问题

如何实现当尝试设置一个不在允许集合中的值时,抛出异常?

原因

直接设置属性值不会自动检查是否在允许的集合中。

解决方法

可以通过自定义特性和JsonConverter来实现这一需求。

代码语言:txt
复制
using Newtonsoft.Json;
using System;
using System.ComponentModel.DataAnnotations;

public class User
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("status")]
    [StatusValidation("active", "inactive", "pending")]
    public string Status { get; set; }
}

public class StatusValidationAttribute : ValidationAttribute
{
    private readonly string[] _allowedValues;

    public StatusValidationAttribute(params string[] allowedValues)
    {
        _allowedValues = allowedValues;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null || !Array.Exists(_allowedValues, allowedValue => allowedValue == value.ToString()))
        {
            return new ValidationResult($"Invalid value for {validationContext.MemberName}. Allowed values are: {_allowedValues.Join(", ")}");
        }

        return ValidationResult.Success;
    }
}

public static class ArrayExtensions
{
    public static string Join(this string[] array, string separator)
    {
        return string.Join(separator, array);
    }
}

在这个例子中,我们创建了一个自定义的验证特性StatusValidationAttribute,它在设置属性值时进行验证。如果值不在允许的集合中,它会抛出一个ValidationResult异常。

参考链接

通过这种方式,可以确保Status属性的值始终是预定义集合中的一个,从而提高代码的健壮性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

父类和子类对象获取值方式验证,通过父类属性方式获取不到,需要使用get方法

父类和子类对象获取值方式验证,通过父类属性方式获取不到,需要使用get方法 静态属性通过类.属性方式获取,对象获取使用get方法获取 package com.example.core.mydemo.java...channelName) { this.channelName = channelName; } /** * partnerName: //通过父类属性方式获取不到...,需要使用get方法 * channelName: //通过父类属性方式获取不到,需要使用get方法 * partnerName2:合作商名称 * channelName2...* channelName3:渠道商名称 //对象自身属性可以获取 * partnerName4:合作商名称 * channelName4:渠道商名称...* MAX=100 静态属性通过类.属性方式获取,对象获取使用get方法获取 * @param args */ public static void main(String

9910

CA2329:不要使用不安全配置反序列化 JsonSerializer

,则会触发此规则: TypeNameHandling 属性是 None 以外。...SerializationBinder 属性 NULL。 默认情况下,此规则会分析整个代码库,但这是可配置。 规则说明 反序列化不受信任数据时,不安全反序列化程序易受攻击。...如何解决冲突 如果可能,请使用 TypeNameHandling None 。 使序列化数据免被篡改。 序列化后,对序列化数据进行加密签名。 在反序列化之前,验证加密签名。...配置代码以进行分析 使用下面的选项来配置代码库哪些部分要运行此规则。 排除特定符号 排除特定类型及其派生类型 你可以仅为此规则、所有规则或为此类别(安全性)中所有规则配置这些选项。...完全限定名称,使用符号文档 ID 格式,前缀 T:(可选)。

73000
  • CA2328:确保 JsonSerializerSettings 是安全

    ,则会触发此规则: TypeNameHandling 属性是 None 以外。...SerializationBinder 属性 NULL。 必须通过以下其中一种方法来使用 JsonSerializerSettings 实例: 初始化为类字段或属性。 由方法返回。...如何解决冲突 如果可能,请使用 TypeNameHandling None 。 使序列化数据免被篡改。 序列化后,对序列化数据进行加密签名。 在反序列化之前,验证加密签名。...配置代码以进行分析 使用下面的选项来配置代码库哪些部分要运行此规则。 排除特定符号 排除特定类型及其派生类型 你可以仅为此规则、所有规则或为此类别(安全性)中所有规则配置这些选项。...完全限定名称,使用符号文档 ID 格式,前缀 T:(可选)。

    54300

    CA2327:不要使用不安全 JsonSerializerSettings

    ,则会触发此规则: TypeNameHandling 属性是除 None 以外。...SerializationBinder 属性 NULL。 必须通过以下其中一种方法来使用 JsonSerializerSettings 实例: 初始化为类字段或属性。 由方法返回。...如何解决冲突 如果可能,请使用 TypeNameHandling None 。 使序列化数据免被篡改。 序列化后,对序列化数据进行加密签名。 在反序列化之前,验证加密签名。...配置代码以进行分析 使用下面的选项来配置代码库哪些部分要运行此规则。 排除特定符号 排除特定类型及其派生类型 你可以仅为此规则、所有规则或为此类别(安全性)中所有规则配置这些选项。...完全限定名称,使用符号文档 ID 格式,前缀 T:(可选)。

    49600

    CA2327:不要使用不安全 JsonSerializerSettings

    ,则会触发此规则: TypeNameHandling 属性是除 None 以外。...SerializationBinder 属性 NULL。 必须通过以下其中一种方法来使用 JsonSerializerSettings 实例: 初始化为类字段或属性。 由方法返回。...如何解决冲突 如果可能,请使用 TypeNameHandling None 。 使序列化数据免被篡改。 序列化后,对序列化数据进行加密签名。 在反序列化之前,验证加密签名。...配置代码以进行分析 使用下面的选项来配置代码库哪些部分要运行此规则。 排除特定符号 排除特定类型及其派生类型 你可以仅为此规则、所有规则或为此类别(安全性)中所有规则配置这些选项。...完全限定名称,使用符号文档 ID 格式,前缀 T:(可选)。

    86140

    CA2330:在反序列化时确保 JsonSerializer 具有安全配置

    ,则会触发此规则: TypeNameHandling 属性是 None 以外。...如何解决冲突 如果可能,请使用 TypeNameHandling None 。 使序列化数据免被篡改。 序列化后,对序列化数据进行加密签名。 在反序列化之前,验证加密签名。...你知道,当 TypeNameHandling 属性是 None 以外时,将始终设置 Newtonsoft.Json.JsonSerializer.SerializationBinder 属性。...配置代码以进行分析 使用下面的选项来配置代码库哪些部分要运行此规则。 排除特定符号 排除特定类型及其派生类型 你可以仅为此规则、所有规则或为此类别(安全性)中所有规则配置这些选项。...完全限定名称,使用符号文档 ID 格式,前缀 T:(可选)。

    56000

    Isito 入门(九):安全认证

    提供密钥管理系统,通讯加密需要使用证书,而证书会过期,所以需要一个管理系统自动颁发证书、替换证书等。 每个服务提供强大身份标识,以实现跨群集和云互操作性。...mtls: 定义双向 TLS 模式,有三种模式。 STRICT: 强制执行 mTLS,要求客户端和服务器使用 TLS 进行通信。这需要客户端和服务器具有有效证书。...这个字段用于验证JWTiss(发行者)声明。 audiences: 受众列表,表示接受JWT一组实体。这个字段用于验证JWTaud(受众)声明。...默认false,表示JWT令牌不会转发给上游服务。如果设置true,则Istio会将令牌添加到请求头中,并转发给上游服务。...如果我们需要验证,当 token 中 issuer example-issuer 才能访问时,可以使用: apiVersion: security.istio.io/v1 kind: AuthorizationPolicy

    32820

    Unity 数据读取|(四)Json文件解析(Newtonsoft.Json ,Litjson,JsonUtility,SimpleJSON)

    它们以键值对形式存储数据,其中键是字符串,可以是字符串、数字、布尔、数组、对象或null。 JSON文件通常具有.json扩展名,例如example.json。...可以解析复杂Json,不需要和Json字段一对一 缺点: 无法使用 IL2CPP 方式打包:Newtonsoft.Json 不支持使用 IL2CPP 方式打包,这可能会限制其在某些特定环境下适用性...不支持跨平台:由于 Unity 跨平台特性,LitJson 可能无法在所有平台上使用。这可能会限制其在某些特定环境下适用性。...Json字符串key需要和类字段名字完全一样 不支持跨平台:由于 Unity 跨平台特性,JsonUtility 可能无法在所有平台上使用。这可能会限制其在某些特定环境下适用性。...如果你需要处理更复杂 JSON 数据,或者对性能有很高要求,可以考虑使用 Newtonsoft.Json 或 JsonUtility。

    1.3K21

    Newtonsoft.Json 迁移到 System.Text.Json

    比如:字符串默认转义,默认不允许尾随逗号,默认不允许带引号数字等,不允许单引号或者不带引号属性名称和字符串。 该库是为了实现性能和安全性而特意这样设计。...System.Text.Json 自定义字符编码 5.自定义转换器 自定义转换器 Converter,是我们比较常用功能,以自定义 Converter 来输出特定日期格式例。...Newtonsoft.Json属性特性>类型上特性>Converters 集合 System.Text.Json:属性特性>Converters 集合>类型上特性 官方文档:如何编写用于...详细说明:如何使用 System.Text.Json 支持某种无效 JSON 3.尾随逗号 尾随逗号即 Json 末尾逗号: 无尾随逗号: { "name": "xiaoshi",...支持 System.Runtime.Serialization 特性 ❌❌ MissingMemberHandling 全局设置 ❌❌ 允许不带引号属性名称 ❌❌ 字符串前后允许单引号 ❌❌ 对字符串属性允许非字符串

    2.3K40

    .NET 云原生架构师训练营(模块二 基础巩固 MVC终结点)--学习笔记

    view=aspnetcore-5.0 什么是模型绑定 控制器和 Razor 页面处理来自 HTTP 请求数据。例如,路由数据可以提供一个记录键,而发布表单域可以为模型属性提供一个。...ModelState.IsValid) { return Page(); } 模型验证特性与消息 [CreditCard]:验证属性是否具有信用卡格式。...[Compare]:验证模型中两个属性是否匹配。 [EmailAddress]:验证属性是否具有电子邮件格式。 [Phone]:验证属性是否具有电话号码格式。...[Range]:验证属性是否在指定范围内。 [RegularExpression]:验证属性是否与指定正则表达式匹配。 [Required]:验证字段是否不为 null。...[StringLength]:验证字符串属性是否不超过指定长度限制。 [Url]:验证属性是否具有 URL 格式。 [Remote]:通过在服务器上调用操作方法来验证客户端上输入。

    2.5K10

    .NET 云原生架构师训练营(模块二 基础巩固 MVC终结点)--学习笔记

    view=aspnetcore-5.0 什么是模型绑定 控制器和 Razor 页面处理来自 HTTP 请求数据。 例如,路由数据可以提供一个记录键,而发布表单域可以为模型属性提供一个。...ModelState.IsValid) { return Page(); } 模型验证特性与消息 [CreditCard]:验证属性是否具有信用卡格式。...[Compare]:验证模型中两个属性是否匹配。 [EmailAddress]:验证属性是否具有电子邮件格式。 [Phone]:验证属性是否具有电话号码格式。...[Range]:验证属性是否在指定范围内。 [RegularExpression]:验证属性是否与指定正则表达式匹配。 [Required]:验证字段是否不为 null。...[StringLength]:验证字符串属性是否不超过指定长度限制。 [Url]:验证属性是否具有 URL 格式。 [Remote]:通过在服务器上调用操作方法来验证客户端上输入。

    2.6K11

    ASP.NET Core 3.0 新增功能

    使用各种现代技术,例如: 通过 HTTP/2 传输 使用 Protocol Buffers 作为接口描述语言 二进制序列化格式 提供以下功能: 身份验证 双向数据流与流程控制 取消与超时 ASP.NET...有关还原为基于 Newtonsoft.Json 序列化程序说明,请参阅切换到 Newtonsoft.Json。...具有 Microsoft 账户任何人都可以登录聊天,但只有所属组织成员可以禁止用户或查看用户聊天记录。该应用可以限制特定用户某些功能。...} 证书身份验证选项 (Options) 提供以下功能: 接受自签名证书。 检查证书吊销。 检查提供证书是否具有正确使用标志。...使用 .NET Core 通用主机(HostBuilder),可以更好地将 ASP.NET Core 应用程序与其他非特定与 Web 服务器方案集成。

    6.7K30

    .NET6新东西---System.Text.Json Writeable DOM

    在.NET 6中,微软加入了JSON Node,可以让我们动态编辑一个JSON文档,就像Newtonsoft.JsonJToken一样,我们就可以更加灵活操作JSON文档。...这次主要新增API如下表: API 说明 JsonNode 表示JSON中一个节点,对应Newtonsoft.JsonJToken JsonObject 表示JSON对象,对应Newtonsoft.Json...中JObject JsonArray 表示JSON数组,对应Newtonsoft.JsonJArray JsonValue 表示JSON中一个,对应Newtonsoft.JsonJValue...对于JsonNode和JsonValue可以通过强制类型转成希望类型,或者通过GetValue来转成类型,这类似于Newtonsoft.JsonValue()方法,代码如下: var jn = JsonNode.Parse...,它会把value打印在控制台中。

    92620

    将JSON字符串反序列化为指定.NET对象类型

    本篇主要讲是如何通过使用Newtonsoft.JsonJsonConvert.DeserializeObject(string value)方法将对应JSON字符串转化为指定.NET对象类型数据...方法一、在项目中定义对应对象参数模型,用于映射反序列化出来参数(复杂JSON字符串数据推荐使用): 如下是一组.NET后台请求接口成功获取到复杂JSON字符串数据: { "id": "123456...方法二、直接将JSON字符串格式数据反序列化转化为字典数据(简单JSON字符串数据推荐使用): 如下一组简单JSON字符串格式数据: { "id": "123456", "code"...: var resultContext=JsonConvert.DeserializeObject>(JSON格式数据); //获取msg...: var msg=resultContext["msg"]; 输出:操作成功

    3.1K20

    再谈Newtonsoft.Json高级用法

    阅读目录 动态改变属性序列化名称 枚举序列化问题 全局设置 总结 回到顶部 动态改变属性序列化名称 "动态改变属性序列化名称"顾名思义:在不同场景下实体字段序列化后字段名称不同,比如有下面实体A,正常序列化后...Childrens 但是前台树形控件所需数据结构 id,nodes /// 这个时候可以使用属性约定转换类 动态设置 序列化后字段名称 /// //...,在Type属性上加上了JsonConverter(typeof(StringEnumConverter))表示将枚举转换成对应字符串,而StringEnumConverter是Newtonsoft.Json...回到顶部 全局设置   全局参数设置功能是我最喜欢使用功能,现在做mvc项目,我都会先设定空处理,减少不必要流量损耗。...上篇文章开篇说了,最初研究Newtonsoft.Json是从移动端项目开始,无用字段空字段不返回。

    1.5K80

    Newtonsoft.Json高级用法

    使用Json时候,我们很多时候会涉及到几个序列化对象使用:DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET即Newtonsoft.Json...    8.枚举自定义格式化问题   9.自定义类型转换   10.全局序列化设置  一.忽略某些属性   类似本问开头介绍接口优化,实体中有些属性不需要序列化返回,可以使用该特性。...二.默认处理     序列化时想忽略默认属性可以通过JsonSerializerSettings.DefaultValueHandling来确定,该枚举 DefaultValueHandling.Ignore...三.空处理 序列化时需要忽略NULL属性,可以通过JsonSerializerSettings.NullValueHandling来确定,另外通过JsonSerializerSettings...通过JsonProperty属性设置方法,可以实现某一属性特别处理需求,如默认处理,空处理,自定义属性名处理,格式化处理。

    3K100

    在 Visual Studio 中安装和使用包(仅适用于 Windows)

    相同过程适用于任何其他 .NET 或 .NET Core 项目。 安装完成后,请引用具有 using 代码中包,其中 特定于正在使用包。...建立引用后,可通过相应 API 调用包。 提示 nuget.org 入门:查找可在自己应用程序中重用组件,.NET 开发人员通常都会浏览 nuget.org 。...出现提示时,接受 Framework 默认。 Visual Studio 创建项目 - 可在解决方案资源管理器中找到此项目。...将“nuget.org”选择“包源”,选择“浏览”选项卡并搜索“Newtonsoft.Json”,在列表中选择该包,然后选择“安装” : 接受任何许可证提示。...在应用中使用 Newtonsoft.Json API 使用项目中 Newtonsoft.Json 包,可调用 JsonConvert.SerializeObject 方法将对象转换为可人工读取字符串

    4.3K30

    ASP.NET Core Web API设置响应输出Json数据格式两种方式

    设置Json统一格式需求 修改属性名称序列化方式,在.Net Core中默认使用小驼峰序列化Json属性参数,前端想要使用与后端模型本身命名格式输出(如:UserName)。...            builder.Services.AddControllers().AddJsonOptions(options =>             {                 //命名规则,该指定用于将对象上属性名称转换为另一种格式...(例如驼峰大小写)或为空以保持属性名称不变策略[前端想要使用与后端模型本身命名格式输出]。                 ...数据 Newtonsoft.Json程序全局配置 说明 在.NET 3.0及其以上版本使用Newtonsoft.Json需要通过安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson...我们致力于构建一个积极向上、和谐友善.NET技术交流平台,广大.NET开发者带来更多价值和成长机会。

    82610

    在 .NET 对象和 JSON 互相序列化时候,枚举类型如何设置成字符串序列化,而不是整型?

    默认情况下,Newtonsoft.Json 库序列化和反序列化 JSON 到 .NET 类型时候,对于枚举使用是整数。...然而,在公开 JSON 格式 API 时,整数会让 API 不易于理解,也不利于扩展和兼容。 那么,如何能使用字符串来序列化和反序列化 JSON 对象中枚举呢?...—— 使用转换器(JsonConverter)。 Newtonsoft.Json 中自带了一些转换器,在 Newtonsoft.Json.Converters 命名空间下。...其中枚举转换是 StringEnumConverter,我们只需要将其标记在属性上即可。...当然,如果你希望属性名也小写化,需要加上额外序列化属性: 1 2 3 4 5 6 7 8 9 10 11 12 13 ++ using System.Runtime.Serialization;

    62140
    领券