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 မွာ သြားေရာက္ ဖတ္ႏုိင္ပါတယ္။


 
4 Kudos
Don't
move!

Leave a Reply