0
点赞
收藏
分享

微信扫一扫

Codable: 实现在 swift 中像 js 那样使用 JSON

Codable: 实现在 swift 中像 js 那样使用 JSON

官方文档,关于 Codable 实现:​​https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types​​

像 ​​js​​​ 一样,​​iOS 11​​​ 之后,​​swift​​​ 也可以方便的使用 ​​json​​ 来传递数据了。

要想使用 ​​json​​​, 你操作的类需要实现 ​​Codable​​​ 接口
​​​Foundation​​​ 中的所有类都已经实现了 ​​Cadable​​​,所以如果你的实体中没有自定义的一些数据类型,都可以直接使用 ​​JSON​

如 ​​js​​​ 一样,​​swift​​​ 中的 ​​json​​ 也有:

  • ​JSONEncoder​将数据转成​​json​​ 数据
  • ​JOSNDecoder​将​​json​​ 数据,转为可用的你需要的数据类型

看下面的 ​​PlayGround​​ 例子便知道如何使用了

由对象转字符串

import Foundation

struct Person: Codable {
var name: String
var age: Int
var intro: String
}

let kyle = Person(name: "Kyle", age: 29, intro: "A web developer")
let tina = Person(name: "Tina", age: 26, intro: "A teacher for English")
let persons = [kyle, tina]

// Encode
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted // setup formatter
let jsonData = try encoder.encode(persons)
print(String(data: jsonData, encoding: .utf8)!)


// Decode
let decoder = JSONDecoder()
// 注意 decode() 中的第一个参数
let people = try decoder.decode(Array<Person>.self, from: jsonData)
print(people[0].name)

输出如下:

[
{
"name" : "Kyle",
"age" : 29,
"intro" : "A web developer"
},
{
"name" : "Tina",
"age" : 26,
"intro" : "A teacher for English"
}
]
Kyle

由字符串转对象

import Foundation

struct Person: Codable {
let name: String
let age: Int
let intro: String
}

let jsonString = """
[
{
"name": "Kyle",
"age": 27,
"intro": "A font-end enginer",
"location": "Jinan"
},
{
"name": "Tina",
"age": 26,
"intro": "A UI enginer",
"location": "Jinan"
}
]
"""

// 1. 先从字符串转为 Data
let jsonData = jsonString.data(using: .utf8)!

// 2. 再用 Data 转成对应的对象
let decoder = JSONDecoder()
let persons = try decoder.decode(Array<Person>.self, from: jsonData)

print(type(of: persons[0]))

Codable: 实现在 swift 中像 js 那样使用 JSON_swift

对象名与 json 名不一致时

有些时候,对象声明中的变量名跟json中的键名不一致,如 ​​nameEn​​​ 在 json 中需要为 ​​json_en​​​ 只需要在对象声明中用 ​​CodingKeys​​ 声明要转成的字符串即可,如下:不需要转的就不需要写 ​​=​​ 后面的东西了

//
// Person.swift
// CustomisedViews
//
// Created by Kyle on 2020/3/2.
// Copyright © 2020 KyleBing. All rights reserved.
//

import Foundation

struct Person: Codable {
var id: String
var name: String
var nameEn: String
var nickName: String
var perk: String
var motto: String
var health: String
var sanity: String
var hunger: String
var version: String
var pic: String

enum CodingKeys: String, CodingKey {
case nameEn = "name_en"
case nickName = "nick_name"
// 下面这些变量名不需要变,就只写 case 就可以了
// 要把对象中的变量全部遍历出来,不然会出错
case id
case name
case perk
case motto
case health
case sanity
case hunger
case version
case pic
}
}


举报

相关推荐

0 条评论