Help us understand the problem. What is going on with this article?

[C#] カスタムAttributeでJSONバリデーションを行う

はじめに

C#のカスタムAttributeでJSONバリデーションを行う方法を紹介します。

Attributeとは

Attribute(属性)とは、クラスやメンバーに追加情報を与えることができます。属性にはパラメータを指定することができ、複数の属性を指定することができます。

[属性名(属性パラメータ)]
メンバーの定義

環境設定

今回実行した環境は下記の通りです。

実行環境
Microsoft .NET Framework 3.5

使いかた

下記のソースコードから Validator フォルダーを各自のプロジェクトにコピーします。
ソースファイルはこちら

JSONオブジェクトを引数にして ValidatorMapper クラスのインスタンスを生成して実行します。

ValidatorMapper validator = new ValidatorMapper(this.reqObj);
validator.Execute();

バリデーションAttribute

Required

Required は、必須チェックを行う属性です。リクエストパラメータに値が指定されていない場合にエラーを返します。

実装例
[Required]
[JsonProperty("userName")]
public string UserName { get; set; }

userName がリクエストパラメータに指定されていない場合は、下記のエラーレスポンスが返されます。

エラーレスポンス
{
    "code": 1004,
    "message": "\"userName\" is a required field."
}

StringLength

StringLength は、文字列長チェックを行う属性です。文字列型のリクエストパラメータの長さが超えた場合にエラーを返します。

実装例
[StringLength(max = 30)]
[JsonProperty("userName")]
public string UserName { get; set; }

userName の値が30文字より長い場合は、下記のエラーレスポンスが返されます。

エラーレスポンス
{
    "code": 1004,
    "message": "\"userName\"(1234567890123456789012345678901) exceeds the number of characters 30 digits."
}

StringDateFormat

StringDateFormat は、日付フォーマットチェックを行う属性です。文字列型のリクエストパラメータの日付フォーマットが正しくない場合にエラーを返します。

実装例
[StringDateFormat("yyyyMMdd")]
[JsonProperty("createDate")]
public string CreateDate { get; set; }

createDate の値がyyyyMMdd形式でない場合は、下記のエラーレスポンスが返されます。

エラーレスポンス
{
    "code": 1004,
    "message": "\"createDate\"(20200401abc) should be entered in the form yyyyMMdd."
}

NumberRange

NumberRange は、数値範囲チェックを行う属性です。数値型のリクエストパラメータの値が範囲外の場合にエラーを返します。

実装例
[NumberRange(from = 0, to = 120)]
[JsonProperty("age")]
public int Age { get; set; }

age の値が0~120の範囲外の場合は、下記のエラーレスポンスが返されます。

エラーレスポンス
{
    "code": 1004,
    "message": "\"age\"(130) is from 0 to 120."
}

ClassValue

ClassValue は、区分値チェックを行う属性です。リクエストパラメータに値が取りうる区分値以外の場合にエラーを返します。

実装例
[ClassValue(new int[] { 0, 1 })]
[JsonProperty("gender")]
public int Gender { get; set; }

gender の値が0,1以外の場合は、下記のエラーレスポンスが返されます。

エラーレスポンス
{
    "code": 1004,
    "message": "\"gender\"(2) is an unavailable value."
}

以上です。

yun_bow
サービス志向エンジニアです。プログラミングを使ったモノづくりが好きです。AWS、Python、GO言語を勉強中。 こちらで投稿した記事は、所属会社の公式見解を示すものではないです。
pa-rk
Webアプリ、スマホアプリの開発を手掛ける技術者集団です。
https://www.pa-rk.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした