Parsing JSON in Swift 4

Swift 4 မှာ JSON အတွက် JSON အတွက် Encoder , Decoder ပါလာပါပြီ။ ကျွန်တော်တို့ Swift 3 မှာ JSON ကနေ Object ကို ပြန်ပြောင်းဖို့ အတွက် code မှာ ပြန်ရေးရပါတယ်။ Code က သာ Array ဖြစ်ခဲ့ရင် ရလာသည့် Array ကို Loop ပြန်ပတ်ပြီးတော့ Object ပြန်ဆောက်ရပါတယ်။ အခု Swift 4 မှာတော့ အောက်ကလို အသုံးပြုနိုင်ပါတယ်။

Decoder

Decoder ကတော့ JSON String ကနေ Codable object ကို ပြောင်းဖို့ အတွက် အသုံးပြုပါတယ်။

JSON Array to Object Array

import UIKit

struct Todo: Codable {
    var id: Int
    var text: String
    var done: Int
}

let res = "[{\"id\":3,\"text\":\"Hello World\",\"done\":0},{\"id\":2,\"text\":\"cool\",\"done\":0},{\"id\":1,\"text\":\"hello\",\"done\":1}]"


let resData = res.data(using: .utf8)!

let decoder = JSONDecoder()
do {
    let todoList = try decoder.decode([Todo].self, from: resData)
}
catch {
    print("error trying to convert data to JSON")
    print(error)
}

အခု code မှာ let decoder = JSONDecoder() ကို အသုံးပြုပြီးတော့ decoder.decode([Todo].self, from: resData) ဆိုရင် ရပါတယ်။ Array ဖြစ်နေသည့် အတွက်ကြောင့် [Todo] ကို အသုံးပြုထားတာပါ။

JSON Object to Object

ဒါမှမဟုတ် object တစ်ခုပဲ ဆိုရင်တော့ အောက်ကလို အသုံးပြုနိုင်ပါတယ်။

let res2 = "{\"id\":3,\"text\":\"Hello World\",\"done\":0}"

let resData2 = res2.data(using: .utf8)!

let decoder = JSONDecoder()
do {
    let todo = try decoder.decode(Todo.self, from: resData2)
}
catch {
    print("error trying to convert data to JSON")
    print(error)
}

အခု Code မှာ ဆိုရင်တော့ Object က တစ်ခု တည်းဖြစ်သည့် အတွက်ကြောင့် Todo.self သုံးထားတာကို တွေ့နိုင်ပါတယ်။

Customizing Key Names

အကယ်၍ JSON string နဲ့ ကျွန်တော်တို့ ဆောက်ထားသည့် object အနည်းငယ် ကွာဟာမှု ရှိခဲ့လျှင်လည်း အောက်ကလို ပြန်ပြင်နိုင်ပါတယ်။

struct Todo: Codable {
    var id: Int
    var text: String
    var done: Int
    
    enum CodingKeys : String, CodingKey {
        case id
        case text = "value"
        case done
    }
}

let res = "[{\"id\":3,\"value\":\"Hello World\",\"done\":0},{\"id\":2,\"value\":\"cool\",\"done\":0},{\"id\":1,\"value\":\"hello\",\"done\":1}]"


let resData = res.data(using: .utf8)!

let decoder = JSONDecoder()
do {
    let todoList = try decoder.decode([Todo].self, from: resData)
}
catch {
    print("error trying to convert data to JSON")
    print(error)
}

ကျွန်တော်တို့တွေ အနေနဲ့ ဘယ် key နဲ့ ချိတ်ထားလဲ ဆိုတာကို enum CodingKeys : String, CodingKey မှာ ဖြည့်ပေးဖို့ လိုပါတယ်။

enum CodingKeys : String, CodingKey {
        case id
        case text = "value"
        case done
}

အခု code မှာဆိုရင် text က value ဆိုသည့် key ကို အသုံးပြုမယ်လို့ ဆိုထားပါတယ်။

Encoder

Encoder ကတော့ Codable object ကနေ json string ကို ပြောင်းဖို့ အတွက် အသုံးပြုပါတယ်။

let t = Todo(id: 10, text: "Sample", done: 0)

let encoder = JSONEncoder()

do {
    let json = try encoder.encode(t)
    if let jsonString = String(data: json, encoding: .utf8) {
        print(jsonString)
    }
}
catch {
    print("error trying to convert data to JSON String")
    print(error)
}


အခု Code က sample code ဖြစ်လို့ ရိုးရိုးရှင်းရှင်းလေးတွေ ပါပဲ။ သို့ပေမယ် တကယ့် project တွေမှာ သုံးသည့် JSON တွေ က အလွန်ကို ရှုပ်ထွေးပြီးတော့ အဆင့်တွေများစွာ ပါတတ်ပါတယ်။

ဒါကြောင့် Codable အကြောင်း အသေးစိတ်ကို http://swiftjson.guide မှာ သွားရောက် ဖတ်နိုင်ပါတယ်။

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Discover more from Saturngod

Subscribe now to keep reading and get access to the full archive.

Continue reading