کار با JSON در سوئیفت

کار با JSON در سوئیفت

فرمت JSON کاربرد گسترده ای در دنیای وب دارد و یکی از رایج ترین روش ها برای انتقال داده می باشد. بسیاری از APIهای مدرن و مخصوصا وب سرویس های RESTful از داده های JSON پشتیبانی می کنند.

در این مطلب آموزشی نحوه کار با فرمت JSON در زبان برنامه نویسی سوئیفت در سیستم عامل های آی او اس، tvOS ،watchOS و OS X آموزش داده می شود.

پیش نیازها

برای کار به Xcode 7 که دربرگیرنده نسخه 2 از زبان برنامه نویسی سوئیفت است نیاز دارید. سوئیفت 2 به معرفی افزونه های متعددی پرداخته که در این مطلب آموزشی مورد استفاده قرار می گیرند، به عنوان نمونه می توان به مدیریت خطاها و عبارت guard اشاره کرد.

1. JSON چیست؟

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

{

"dataTitle": "JSON Tutorial!",

"swiftVersion": 2.1

"users": [

{

"name": "John",

"age": 25

},

{

"name": "Mark",

"age": 29

},

{

"name": "Sarah",

"age": 22

}

],

}

همانطور که مشاهده می کنید درک این فرمت داده ای بسیار آسان است و با دو مجموعه انواع، دیکشنری و آرایه ساختاربندی شده است. دیکشنری ها دربرگیرنده یک یا تعداد بیشتری از جفت های کلید-مقدار هستند و درون آکولاد جای گرفته اند و آرایه ها فهرستی از آیتم های مرتب شده اند که درون براکت جای دارند. تقریبا تمامی زبان های برنامه نویسی این مجموعه انواع را تعریف می کند و همین امر پشتیبانی وسیع از این فرمت را موجب شده است.

در زیر فهرستی از انواع داده های پشتیبانی شده در یک آبجکت JSON را مشاهده می کنید:

- رشته

- عدد از نوع صحیح، شناور و double

- بولین

- آرایه

- دیکشنری

یکی دیگر از دلایل محبوبیت این نوع فرمت سادگی خواندن و درک آن توسط افراد می باشد که به راحتی توسط ماشین ها نیز پردازش می گردد. پارسینگ و سریالایزینگ زمانی صورت می گیرد که ماشین با دریافت یک سری داده خام آنها را به آبجکتی که قابل استفاده توسط اپلیکیشن است تبدیل می نماید.

2. خواندن داده های JSON

گام 1: ساخت playground

Xcode را باز کرده و یک playground جدید بسازید و با اختصاص نامی به آن، آی او اس را به عنوان پلتفرم ست کنید.

گام 2: افزودن داده JSON

با مراجعه به نویگیتور سمت چپ، بخش JSON را باز کرده و بر روی Resources کلیک راست کنید، پس از آن از منوی نمایش داده شده New File را انتخاب نمایید.

blog_16626_1

فایل را data.json نام گذاری کنید و دادهای زیر را درون آن قرار دهید.

{

"users": [

{

"name": "John",

"age": 25

},

{

"name": "Mark",

"age": 29

},

{

"name": "Sarah",

"age": 22

}

],

"dataTitle": "JSON Tutorial!",

"swiftVersion": 2.1

}

گام 3: دریافت داده ها

اکنون که درک پایه ای از فرمت داده ای JSON کسب کردید باید نحوه استفاده از آن در سوئیفت را بیاموزید. محتوای playground را حذف کنید و سه خط کد زیر را به آن اضافه کنید.

import UIKit

let url = NSBundle.mainBundle().URLForResource("Data", withExtension: "json")

let data = NSData(contentsOfURL: url!)

با استفاده از این کد رفرنسی به فایل JSON که به playground افزوده بودید دارید، بنابراین محتوای آن را به عنوان داده های خام دریافت نمایید. توجه داشته باشید URL ساخته شده از نوع لوکال یا محلی است و نسبت به موقعیت قرارگیری فایل در کامپیوتر ساخته شده است و می توانید URL سرویس وب و یا هر URL ای دیگری را مورد استفاده قرار دهید.

تنها بخش حیاتی آبجکت خام NSData است و می توان آن را از یک URL که در مثال زیر نیز نمایش داده شده، از پاسخ API و یا منابعی دیگری بدست آورد.

گام 4: Parsing داده ها

گام بعدی parse و serialize کردن این داده و تبدیل آنها به آبجکتی قابل استفاده است. خوشبختانه در آی او اس و OS X کلاس NSJOSNSerialization تمامی عملیات دشوار پارسینگ و سریالایزینگ را بر عهده می گیرد. قطعه کد زیر را به playground خود بیفزایید.

do {

let object = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)

if let dictionary = object as? [String: AnyObject] {

readJSONObject(dictionary)

}

} catch {

// Handle Error

}

تمامی منطق کار در یک عبارت do-catch جای داده شده، چرا که serialization از داده های JSON منجر به بروز خطایی می شود. در ادامه به فراخوانی متد (JSONObjectWithData (_:options از کلاس NSJSONSerialization پرداخته و آبجکت NSData و گزینه های دیگر را ارسال می کنیم. گزینه های قابل ارسال با ساختار NSJSONReadingOptions تعریف شده اند:

AllowFragments : برای آبجکت های موجود در سطح اول و یا سطح بالا از داده های JSON که از نوع آرایه و یا دیکشنری نیستند اجازه خواندن را می دهد. در داده های JSON که در این مطلب آموزشی مورد استفاده قرار گرفته این بخش دربرگیرنده مقادیر dataTitle و SwiftVersion می باشد.

MutavleLeaves : این گزینه امکان خواندن رشته ها از داده های JSON و ساخت خودکار به عنوان نمونه هایی از NSMutableString را می دهد و به توسعه Objective-C ارتباط بیشتری دارد. در سوئیفت می توانید این گزینه را نادیده بگیرید، چرا که رشته ها یک نوع پیش ساخته دارند و هنگامی که داده ها با کلید واژه var تعریف شوند به طور خودکار تغییرپذیر می گردند.

MutableContainers : این گزینه به آرایه ها و دیکشنری ها امکان خواندن داده های JSON و قابلیت تغییرپذیری را می دهد. مشابه گزینه MutableLeaves، در سوئیفت استفاده از کلید واژه var در زمان تخصیص آرایه یا دیکشنری به یک متغیر آن را به طور خودکار تغییرپذیر می سازد.

در این بخش به بررسی اینکه آیا آبجکت سریالایز شده آن نوع [String: AnyObject] است می پردازیم و این کار با تابع ()readJSONObject صورت می پذیرد. بیایید نگاهی به متد (:_)readJSONObject بیندازیم.

گام 5: کار با داده ها

هنگامی که داده های JSON که جمع آوری شده بود پارس و سریالایز شدند قادر به تعامل با آن مشابه هر دیکشنری دیگر می گردید. تابع زیر را در قسمت بالای عبارت do-catch به playground اضافه کنید.

func readJSONObject(object: [String: AnyObject]) {

guard let title = object["dataTitle"] as? String,

let version = object["swiftVersion"] as? Float,

let users = object["users"] as? [[String: AnyObject]] else { return }

_ = "Swift \(version) " + title

for user in users {

guard let name = user["name"] as? String,

let age = user["age"] as? Int else { break }

switch age {

case 22:

_ = name + " is \(age) years old."

case 25:

_ = name + " is \(age) years old."

case 29:

_ = name + " is \(age) years old."

default:

break

}

}

}

همانطور که مشاهده می کنید داده سریالایز شده نیز مانند یک دیکشنری یا آرایه قابل تعامل می باشد. تابع ()readJSONObject به عنوان مثالی از نحوه خارج کردن اطلاعات از یک آبجکت سریالایز شده JSON در اختیار شما قرار گرفته. توجه داشته باشید که عبارت switch در تابع به منظور جدا کردن رشته ها در خروجی playground قرار داده شده است.

زمانی که playground اجرای کد شما را به اتمام رسانید قادر به مشاهده نتیجه در نوار کناری مشابه زیر می باشید.

blog_16626_2

هم اکنون شما با fetch کردن و serialize کردن داده های JSON و استفاده از آن مانند یک دیکشنری معمولی در کد سوئیفت خود آشنایی دارید. همانطور که می بینید فرآیند بسیار ساده می باشد و این سادگی در نتیجه استفاده از NSJSONSerialization حاصل شده است که مراحل دشوار کار را بر عهده گرفته است.

3. نوشتن داده های JSON

علاوه بر خواندن داده های JSON که ممکن است از یک منبع آنلاین و یا فایل لوکال دریافت کرده باشید، نحوه ساخت داده های JSON نیز اهمیت دارد. ممکن است این داده ها به شکل لوکال ذخیره سازی شده و یا به یک وب سرویس ارسال شود، فرآیند کار مشابه فرآیند خواندن و بسیار ساده است، نگاهی به مثال زیر بیندازید. زمانی که داده های JSON خود را از یک آبجکت می سازید، باید اول از همه از متد (:_)isValidJSONObject استفاده کنید تا ببینید آیا آبجکت موردنظر قابلیت تبدیل به یک آبجکت JSON را دارد یا خیر.

let validDictionary = [

"numericalValue": 1,

"stringValue": "JSON",

"arrayValue": [0, 1, 2, 3, 4, 5]

]

let invalidDictionary = [

"date": NSDate()

]

if NSJSONSerialization.isValidJSONObject(validDictionary) { // True

do {

let rawData = try NSJSONSerialization.dataWithJSONObject(validDictionary, options: .PrettyPrinted)

} catch {

// Handle Error

}

}

if NSJSONSerialization.isValidJSONObject(invalidDictionary) { // False

// NSJSONSerialization.dataWithJSONObject(validDictionary, options: .PrettyPrinted) will produce an error if called

}

پس از انجام این بررسی اولیه، متد (:_)dataWithJSONObject را صدا می زنید، این متد در صورت موفقیت یک آبجکت NSData را باز می گرداند. از آنجایی که اعتبار آبجکت سنجیده شده، خطای catch در اینجا مانند قبل اهمیت ندارد، اما ممکن است در نتیجه یک خطای داخلی API در زمان ساخت داده خام صدا زده شود.

گزینه PrettyPrinted استفاده شده در این مثال تنها گزینه قابل استفاده با این متد است که با افزودن فضای خالی به داده های JSON خوانایی را تسهیل می بخشد.

// With PrettyPrinted Option:

{

"name": "John",

"age": 25

}

// Without PrettyPrinted Option:

{"name":"John","age": 25}

آبجکت NSData بازگردانده شده را می توانید به صورت موردنظر استفاده کنید، به عنوان نمونه می توانید آن را در یک فایل لوکال ذخیره کرده و یا آن را به یک وب سرویس ارسال کنید.

نتیجه گیری

در این مرحله باید به راحتی قادر به کار با داده های JSON باشید. کلاس مهم در این بین NSJSONSerialization است که از عبارات guard و do-catch نیز استفاده می کند. همانطور که مشاهده می کنید کار با داده های JSON  به سادگی صورت می پذیرد و با parse و serialize شدن داده های JSON قادر به تعامل با آن مشابه هر نوع آبجکتی دیگری می گردید.

 

 

http://code.tutsplus.com برگرفته از

 

اینها را هم بخوانید