当前位置: 首页 > news >正文

Swift中SwiftyJSON使用详情

1.简单的JSON数据结构

 原始 JSON:

//json数据
{"name": "John Doe","age": 30,"isStudent": false
}

对应的 Model 类: 

struct Person {let name: Stringlet age: Intlet isStudent: Bool// 使用 SwiftyJSON 初始化init(json: JSON) {name = json["name"].stringValueage = json["age"].intValueisStudent = json["isStudent"].boolValue}
}

调用方式:

let json = JSON(parseJSON: jsonString)
let person = Person(json: json)
print("Name: \(person.name), Age: \(person.age)")

2.嵌套对象 JSON

原始 JSON:

{"person": {"name": "Jane Smith","address": {"street": "123 Main St","city": "New York"}}
}

对应的 Model 类:

//先从最内层开始解析
struct Address {let street: Stringlet city: Stringinit(json: JSON) {street = json["street"].stringValuecity = json["city"].stringValue}
}struct PersonInfo {let name: Stringlet address: Addressinit(json: JSON) {name = json["name"].stringValueaddress = Address(json: json["address"])}
}struct RootObject {let person: PersonInfoinit(json: JSON) {person = PersonInfo(json: json["person"])}
}

调用方式:

let json = JSON(parseJSON: jsonString)
let root = RootObject(json: json)
print("\(root.person.name) lives at \(root.person.address.street)")

3. 数组 JSON 结构

原始 JSON:

{"fruits": ["apple", "banana", "orange"]
}

对应的 Model 类:

struct Fruits {let fruits: [String]init(json: JSON) {fruits = json["fruits"].arrayValue.map { $0.stringValue }}
}

调用方式:

let json = JSON(parseJSON: jsonString)
let fruits = Fruits(json: json)
print("Available fruits: \(fruits.fruits.joined(separator: ", "))")

4.复杂嵌套结构

原始 JSON:

{"company": "Tech Inc.","departments": [{"name": "Engineering","employees": [{"id": 101,"name": "Mike","skills": ["Swift", "Python", "JavaScript"]}]}]
}

对应的 Model 类:

struct Employee {let id: Intlet name: Stringlet skills: [String]init(json: JSON) {id = json["id"].intValuename = json["name"].stringValueskills = json["skills"].arrayValue.map { $0.stringValue }}
}struct Department {let name: Stringlet employees: [Employee]init(json: JSON) {name = json["name"].stringValueemployees = json["employees"].arrayValue.map { Employee(json: $0) }}
}struct Company {let name: Stringlet departments: [Department]init(json: JSON) {name = json["company"].stringValuedepartments = json["departments"].arrayValue.map { Department(json: $0) }}
}

调用方式:

let json = JSON(parseJSON: jsonString)
let company = Company(json: json)print("Company: \(company.name)")
for department in company.departments {print("\nDepartment: \(department.name)")for employee in department.employees {print(" - \(employee.name) (ID: \(employee.id))")print("   Skills: \(employee.skills.joined(separator: ", "))")}
}

5.使用 Codable 协议 (推荐方式)

原始 JSON:

//json数据
{"name": "John Doe","age": 30,"isStudent": false
}

对应的 Model 类:

struct Person: Codable {let name: Stringlet age: Intlet isStudent: Bool
}// 解析方法
extension Person {static func from(json: JSON) -> Person? {do {let data = try json.rawData()return try JSONDecoder().decode(Person.self, from: data)} catch {print("Decoding error: \(error)")return nil}}
}

调用方式:

let json = JSON(parseJSON: jsonString)
if let person = Person.from(json: json) {print("Person: \(person.name)")
}

6.复杂结构的 Codable 实现

原始JSON:

{"company": "Tech Inc.","departments": [{"name": "Engineering","employees": [{"id": 101,"name": "Mike","skills": ["Swift", "Python", "JavaScript"]}]}]
}

对应的 Model 类:

struct Company: Codable {let name: Stringlet departments: [Department]enum CodingKeys: String, CodingKey {case name = "company"case departments}
}struct Department: Codable {let name: Stringlet employees: [Employee]
}struct Employee: Codable {let id: Intlet name: Stringlet skills: [String]
}// 解析扩展
extension Company {static func from(json: JSON) -> Company? {do {let data = try json.rawData()return try JSONDecoder().decode(Company.self, from: data)} catch {print("Decoding error: \(error)")return nil}}
}

7.完成的例子

原始JSON:

// 使用示例
let jsonString = """
{"id": 1,"name": "John Doe","address": {"street": "123 Main St","city": "New York","zip_code": "10001"},"tags": ["swift", "ios", "developer"]
}
"""

对应的 Model 类:

import SwiftyJSONstruct User: Codable {let id: Intlet name: Stringlet email: String?let address: Addresslet tags: [String]struct Address: Codable {let street: Stringlet city: Stringlet zipCode: String?enum CodingKeys: String, CodingKey {case street, citycase zipCode = "zip_code"}}
}extension User {static func from(json: JSON) -> User? {do {let data = try json.rawData()let decoder = JSONDecoder()decoder.keyDecodingStrategy = .convertFromSnakeCase // 处理蛇形命名return try decoder.decode(User.self, from: data)} catch {print("Decoding error: \(error)")return nil}}
}

调用方式:

let json = JSON(parseJSON: jsonString)
if let user = User.from(json: json) {print("User: \(user.name)")print("Address: \(user.address.street), \(user.address.city)")print("Tags: \(user.tags.joined(separator: ", "))")
}

http://www.dtcms.com/a/274138.html

相关文章:

  • 墙裂推荐!McpStore库三行代码为Agent添加MCP能力
  • 业务建模如何让金融数字化转型 “轻” 装上
  • CentOS7环境安装包部署并配置MySQL5.7
  • 什么是proxy
  • 使用浏览器inspect调试wx小程序
  • 构建基于表单配置的 Jenkins 测试项目(接口、UI、APP、Jmeter)
  • 加速市场反馈,助力产品迭代升级​
  • 如何使用 Python 删除 Excel 中的行、列和单元格 – 详解
  • IAR携手矽力杰与普华基础软件,共推RISC-V车规芯片高安全应用落地
  • docker 启动中间件
  • Python 数据建模与分析项目实战预备 Day 2 - 数据构建与字段解析(模拟简历结构化数据)
  • 【Python练习】038. 编写一个函数,检查一个链表是否有环
  • PHY模式,slave master怎么区分
  • 力扣网编程134题:加油站(双指针)
  • Android15 无法接收到应用自身发出的广播分析解决
  • 【牛客刷题】dd爱科学1.0
  • Java 大视界 -- Java 大数据在智能医疗远程手术机器人操作数据记录与分析中的应用(342)
  • 从静到动的创作革命:Midjourney Video V1重塑AI影像叙事
  • 滑动窗口-3.无重复字符的最长子串-力扣(LeetCode)
  • 【Linux】虚拟内存的概念和布局
  • UI自动化神器:Playwright元素定位方法!
  • 新型变种木马正在伪装成Termius入侵系统
  • Kotlin 常用语法糖完整整理
  • 【springboot】IDEA手动创建SpringBoot简单工程(无插件)
  • 【零基础学AI】第37讲:提示词工程(Prompt Engineering)
  • NLP_知识图谱_大模型——个人学习记录
  • 解决MySQL虚拟删除影响唯一索引的问题
  • 《PyWin32:Python与Windows的桥梁,解锁系统自动化新姿势》
  • 从0开始学习R语言--Day44--LR检验
  • 外媒:蚂蚁数科等科技公司在香港数字资产枢纽建设中显身手