اعتبارسنجی JSON با JSON Schema

دوشنبه 17 اردیبهشت 1397

وقتی که ساختار داده ای JSONای (JSON Schema) را ایجاد کرده اید که یک سند JSON را شرح می دهد، می توانید از آن در ویژوال استودیو استفاده کنید، تا در هنگام ایجاد اسناد JSON هدایت های لازم را انجام دهد و در زمان اجرا برای اعتبارسنجی فایل های JSON یا پیام های دریافتی استفاده کنید، و اطمینان حاصل کنید که کدتان سعی ندارد چیزی که به درستی فرمت نشده است را پردازش کند.

اعتبارسنجی JSON با JSON Schema

اعتبارسنجی در زمان اجرا

پکیج هایی وجود دارند که اعتبارسنجی JSON را با ساختارها (Schema) پشتیبانی می کنند، اما NewtonSoft.Json.Schema به راحتی از طریق NuGet قابل دسترس است (اگر با ASP.NET Core کار می کنید، در حال حاضر نسخه قبلی آن در دسترس است). این پکیج شامل دو شیء است که می توانید برای اعتبارسنجی استفاده کنید: JsonSchema (که چندان مناسب نیست) و مورد جدیدتر، JSchema (که همان چیزی است که باید استفاده کنید). پکیج NewtonSoft تا زمانی که کمتر از 1000 اعتبارسنجی در ساعت انجام دهید رایگان است. اگر فکر می کنید که بیشتر از این با آن کار می کنید، باید هزینه های خود را بررسی کنید.

می توانید از کلاس های JObject و JSchema پکیج NewtonSoft برای تجزیه رشته های JSON استفاده کرده و سپس بررسی کنید ببینید آیا رشته JSON در برابر ساختار معتبر است یا خیر. کد زیر فرض می کند که ساختار در یک متغیر رشته ای به نام jsonSchema قرار دارد و JSON واقعی در متغیر رشته ای به نام jsonInput است:

Dim js As JSchema
js = JSchema.Parse(jsonSchema)
Dim jo As JObject
jo = JObject.Parse(jsonInput)

ما فکر می کنیم که این کد مناسب نیست، حداقل برای پردازش ساختار. شما احتمالا ساختار خود را در یک فایل نگه می دارید. ساده ترین راه برای لود کردن کلاس های JSchema و JObject از فایل ها این است که از متد ReadAllText شیء File استفاده کنید، مثل کد زیر:

Dim js As JSchema
js = JSchema.Parse(File.ReadAllText("RequestCustomerSchema.json"))
Dim jo As JObject
jo = JObject.Parse(File.ReadAllText("CustomerRequest.json"))

در یک وب سرویس، به احتمال زیاد ترکیب اینگونه است که شما ساختارتان را از یک فایل می خوانید اما سند JSON خود را به عنوان پارامتر برای ASP.NET Web API اعمال می کنید.

صرف نظر از لود شدن این دو شیء، برای بررسی اینکه سند JSON در برابر ساختار معتبر است، شما متد IsValid کلاس JObject، که شیء JSchema و مجموعه ای که به عنوان IList از String اعلان شده است را ارسال می کند، را فراخوانی می کنید. این مجموعه پیام های خطایی که یافت می شود را جمع آوری می کند. کد اصلی با استفاده از متد IsValid به این صورت خواهد بود:

Dim errors As IList(Of String) = Nothing
If Not jo.IsValid(js, errors) Then 
  For Each err As String In errors
    '...assemble error message collection to return to the client...
  Next
  Return ErrorMessages
End If

در C#، پارامتر دوم که پیام خطا را نگهداری می کند باید علامت گذاری شود.

اعتبارسنجی و ایجاد اشیای NET.

با این حال، با استفاده از ابزارهای NewtonSoft می توانید یک سند JSON را به متغیرهای NET Framework. تجزیه کنید. با کمی کد بیشتر، می توانید شیء JSON خود را به شیء NET Framework. با انجام اعتبارسنجی به صورت خودکار تبدیل کنید. اولین قدم همان است که در بالا ذکر شد.

باید یک شیء JSchema را با استفاده از کدی که قبلا دیدید لود کنید.

گام بعدی این است که سند JSON خود را در یک TextReader فراهم کنید. اگر سند JSON را از یک فایل خواندید، می توانید از کد زیر استفاده کنید:

Dim tr As TextReader
tr = File.OpenText("CustomerRequest.json")

اگر با یک رشته JSON ذخیره شده در یک پارامتر فراخوانده شده سر و کار دارید، مثلا jsonInput، پس از این کد استفاده کنید:

Dim tr As TextReader
tr = New StringReader(jsonInput)

گام بعدی این است که آن TextReader را در JsonTextReader مربوط به NewtonSoft ارسال کنید، مانند کد زیر:

Dim jr As JsonTextReader
jr = New JsonTextReader(tr)

سپس JsonTextReader باید در JSchemaValidatingReader مربوط به NewtonSoft ارسال شود. شما باید ویژگی Schema خوانده شده را به شیء JSchema خود تنظیم کنید، مانند دستور زیر:

Dim vr As JSchemaValidatingReader
vr = New JSchemaValidatingReader(jr)
vr.Schema = js

حالا شما آماده اید تا اشیای NET Framework. خود را از سند JSON با ایجاد JsonSerializer و استفاده از متد Deserialize و ارسال ValidatingReader خود تولید کنید. Deserializer یک شی NET Framework. را بر اساس عناصری که در سند JSON یافته است باز می گرداند:

Dim jsr As New JsonSerializer()
Dim cr As CustomerRequest
cr = jsr.Deserialize(Of CustomerRequest)(vr)

شیء NET Framework. شما باید کلاسی باشد که نام ویژگی های آن با عناصر شیء JSON مطابقت داشته و با نوع داده ها سازگار باشد. مثلا این کلاس و سند JSON سازگار هستند:

{
   "customerId": "A123"
}
Public Class CustomerRequest
   Public Property CustomerId As String
End Class

با استفاده از این روش، متد Deserialize وقتی خطایی رخ دهد یک exception را باز می گرداند. به طور معمول، ما با سربار exception راحت نیستیم، اما احتمالا این چیزی است که می‌خواهید. شما نمی خواهید در بخش try یک پیام نامعتبر JSON را پردازش کنید.

کد معمول برای بخش catch و گزارش گیری خطاهای اعتبارسنجی می تواند چیزی شبیه دستور زیر باشد:

Try
  cr = jsr.Deserialize(Of CustomerRequest)(vr)
Catch ex As JSchemaException
  '...log error information...
   Throw New Exception("Invalid format for message", ex)
End Try

NewtonSoft همچنین شامل یک نویسنده (writer) اعتبارسنجی است که می توانید وقتی کلاس های NET Frameowrk. را به اسناد JSON تبدیل می کنید، با متد Serialize مربوط به JsonSerializer استفاده کنید. توصیه می کنیم در هنگام تست کردن از آن استفاده کنید تا مطمئن شوید که خروجی معتبری را ایجاد کرده اید، اما هنگام تولید باید نویسنده اعتبارسنجی را کنار بگذارید تا سربار را کاهش دهید.

با این ابزار (و یک ساختار JSON) می توانید اطمینان حاصل کنید که پیامی که مطابق با استانداردهای شما نیست را پردازش نمی کنید.

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

تاکنون هیچ کاربری از این پست تشکر نکرده است

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید