HandyJSON使用詳情

注意事項:Model 需要實現?HandyJSON?協議,對于簡單情況,只需聲明?class/struct?并添加?HandyJSON?協議即可

1.簡單 JSON 結構

JSON 數據:

{"name": "John","age": 30,"isStudent": false
}

Model 類:

struct Person: HandyJSON {var name: String?var age: Int?var isStudent: Bool?
}

解析調用:

let jsonString = "{\"name\":\"John\",\"age\":30,\"isStudent\":false}"
if let person = Person.deserialize(from: jsonString) {print("Name: \(person.name ?? ""), Age: \(person.age ?? 0), isStudent: \(person.isStudent ?? false)")
}

2.嵌套 JSON 結構

JSON 數據:

{"city": "New York","population": 8500000,"mayor": {"name": "Eric Adams","age": 61}
}

Model 類:

struct Mayor: HandyJSON {var name: String?var age: Int?
}struct City: HandyJSON {var city: String?var population: Int?var mayor: Mayor?
}

解析調用:


if let city = City.deserialize(from: jsonString) {print("City: \(city.city ?? ""), Population: \(city.population ?? 0)")print("Mayor: \(city.mayor?.name ?? ""), Age: \(city.mayor?.age ?? 0)")
}

3.包含數組的 JSON 結構

JSON 數據:

{"school": "Stanford University","departments": [{"name": "Computer Science","students": 1200},{"name": "Mathematics","students": 800}]
}

Model 類:

struct Department: HandyJSON {var name: String?var students: Int?
}struct School: HandyJSON {var school: String?var departments: [Department]?
}

解析調用:

if let school = School.deserialize(from: jsonString) {print("School: \(school.school ?? "")")school.departments?.forEach { dept inprint("Department: \(dept.name ?? ""), Students: \(dept.students ?? 0)")}
}

4.自定義映射和轉換

JSON 數據:

{"user_id": 12345,"created_at": "2023-05-15","is_premium": "yes"
}

Model 類:

struct Account: HandyJSON {var userId: Int?var createdAt: String?var isPremium: Bool?mutating func mapping(mapper: HelpingMapper) {// 指定 JSON 字段名和屬性名的映射mapper <<< self.userId <-- "user_id"mapper <<< self.createdAt <-- "created_at"// 自定義轉換mapper <<< self.isPremium <-- TransformOf<Bool, String>(fromJSON: { value inreturn value == "yes"},toJSON: { value inreturn value == true ? "yes" : "no"})}
}

解析調用:

let jsonString = "{\"user_id\":12345,\"created_at\":\"2023-05-15\",\"is_premium\":\"yes\"}"
if let account = Account.deserialize(from: jsonString) {print("User ID: \(account.userId ?? 0)")print("Created at: \(account.createdAt ?? "")")print("Is premium: \(account.isPremium ?? false)")
}

5.繼承關系的 Model

JSON 數據:

{"type": "student","name": "Alice","grade": "A","courses": ["Math", "Physics"]
}

Model 類:

class Person: HandyJSON {var type: String?var name: String?required init() {}
}class Student: Person {var grade: String?var courses: [String]?required init() {super.init()}override func mapping(mapper: HelpingMapper) {super.mapping(mapper: mapper)}
}

解析調用:

if let student = Student.deserialize(from: jsonString) {print("Name: \(student.name ?? "")")print("Grade: \(student.grade ?? "")")print("Courses: \(student.courses?.joined(separator: ", ") ?? "")")
}

6.高級用法

可選和非可選屬性/HandyJSON 支持可選和非可選屬性:

struct User: HandyJSON {var id: Int         // 非可選,JSON中必須存在var name: String?   // 可選,JSON中可以不存在
}

默認值

struct Settings: HandyJSON {var theme: String = "light"  // 默認值var fontSize: Int = 14
}

枚舉支持

enum UserType: String, HandyJSONEnum {case admin = "admin"case user = "user"case guest = "guest"
}struct UserProfile: HandyJSON {var type: UserType?var username: String?
}

7.總結

HandyJSON 在 Swift 中提供了簡單易用的 JSON 解析功能:

  1. 定義 Model 時實現?HandyJSON?協議

  2. 使用?deserialize(from:)?方法解析 JSON

  3. 可以通過?mapping(mapper:)?方法自定義映射關系

  4. 支持嵌套對象、數組、繼承等復雜結構

  5. 提供類型轉換和默認值等高級功能

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91081.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91081.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91081.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

comfyUI-IPApterfaceID人臉特征提取

1.基礎節點 以Checkpoint、CLIP、空Latent、K采樣器、VAE解碼、預覽圖像為基礎節點。 2.人臉特征獲取節點 IPAdapter FaceID節點專用于將特定人臉特征&#xff08;通過參考圖提取&#xff09;融入生成圖像。 參考圖像&#xff0c;正面圖像是想要參考人物的人像&#xff0c;最…

【React Native】Switch、Alert、Dimensions、StatusBar、Image組件

其他常用組件 swich https://reactnative.dev/docs/next/switch alert Alert React Native 如果想增加里面的按鈕&#xff0c;就往這個數組里&#xff0c;按照這個格式不斷的加東西就行了。但是&#xff1a; 在iOS上&#xff0c;里面多少個都有問題&#xff0c;3 個以上它…

滲透筆記1-4

一、HTTPS安全機制 1. HTTP的安全風險 竊聽風險&#xff1a;明文傳輸導致通信內容可被直接截獲&#xff08;如Wireshark抓包獲取密碼&#xff09;。篡改風險&#xff1a;中間人可修改傳輸內容&#xff08;如注入惡意腳本&#xff09;。冒充風險&#xff1a;攻擊者偽造服務端身份…

《星盤接口6:星際聯盟》

《星盤接口6&#xff1a;星際聯盟》? 第一章&#xff1a;新的黎明地球歷2097年&#xff0c;陳欣和她的團隊成功地將“數據之神”封印在一個獨立的數據維度中&#xff0c;暫時解除了對銀河系的威脅。然而&#xff0c;這場勝利并沒有帶來長久的和平。隨著人類文明不斷擴展至更遙…

【安卓筆記】進程和線程的基礎知識

0. 環境&#xff1a; 電腦&#xff1a;Windows10 Android Studio: 2024.3.2 編程語言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 先熟悉JVM虛擬機的線程 ----------以下都是系統線程&#xff0c;由JV…

26-計組-多處理器

多處理器的基本概念1. 計算機體系結構分類依據&#xff1a;根據指令流和數據流的數量關系&#xff0c;計算機體系結構可分為四種類型&#xff1a;SISD、SIMD、MISD、MIMD。&#xff08;1&#xff09;SISD 單指令流單數據流定義&#xff1a;任意時刻計算機只能執行單一指令操作單…

vscode 插件開發activityba

在 VS Code 插件開發中&#xff0c;**Activity Bar&#xff08;活動欄&#xff09;**是左側垂直導航欄的核心組成部分&#xff0c;它為用戶提供了快速訪問插件功能的入口。通過自定義 Activity Bar&#xff0c;開發者可以顯著提升插件的可見性和用戶體驗。以下是關于 Activity …

【橘子分布式】Thrift RPC(理論篇)

一、簡介 首先還是那句話&#xff0c;概念網上已經很多了&#xff0c;我們就不多逼逼了。我來大致介紹一下。 Thrift是一個RPC框架可以進行異構系統(服務的提供者 和 服務的調用者 不同編程語言開發系統)的RPC調用為什么在當前的系統開發中&#xff0c;會存在著異構系統的RPC…

項目進度依賴紙面計劃,如何提升計劃動態調整能力

項目進度依賴紙面計劃會導致實際執行中的調整能力不足。提升計劃動態調整能力的方法包括&#xff1a;建立動態進度管理系統、強化團隊溝通與協作、定期開展風險評估與進度復盤。特別是建立動態進度管理系統&#xff0c;通過信息技術工具實現實時跟蹤和反饋&#xff0c;使計劃能…

遞推預處理floor(log_2{n})

在C中&#xff0c;除了使用<cmath>中的log或log2函數求對數&#xff0c;也可以通過遞推求出所有可能用到的?log?2i?,i∈[1,n]\lfloor \log_2i\rfloor, i\in[1, n]?log2?i?,i∈[1,n] 證明&#xff1a;?log?2i??log?2?i2??1\lfloor \log_2i \rfloor\lfloor \…

【AI智能體】智能音視頻-搭建可視化智能體

可視化智能體是語音小伴侶智能體的升級版&#xff0c;支持語音與視頻的雙模態交互。本文詳細介紹了音視頻交互的實現原理、智能體搭建方法及效果測試&#xff0c;幫助開發者快速構建支持音視頻交互的智能體。 應用場景 可視化智能體適用于多種場景&#xff0c;舉例如下&#…

Sensoglove推出新一代外骨骼力反饋手套:主動力反饋+亞毫米級手指追蹤,助力機器人操控與虛擬仿真

在工業自動化、虛擬現實和醫療康復等領域&#xff0c;高精度手部交互設備的需求日益增長。Sensoglove推出的Rembrandt外骨骼力反饋手套&#xff0c;結合主動力反饋、觸覺反饋與亞毫米級追蹤技術&#xff0c;為用戶提供更自然、更安全的操作體驗。Sensoglove外骨骼力反饋手套核心…

AutoMapper入門

在 ASP.NET Core 開發中&#xff0c;我們經常需要在不同層之間傳遞數據&#xff1a;比如從數據庫模型&#xff08;Entity&#xff09;轉換到 DTO&#xff0c;再從 DTO 轉換為前端視圖模型。這些轉換代碼大量重復、冗長、容易出錯。為了解決這個問題&#xff0c;AutoMapper 誕生…

PyTorch武俠演義 第一卷:初入江湖 第1章:武林新秀遇Tensor - 張量基礎

第一卷&#xff1a;初入江湖 第1章&#xff1a;武林新秀遇Tensor - 張量基礎晨起碼農村 雞鳴三聲&#xff0c;林小碼已經收拾好了行囊。他最后看了眼床頭那本翻舊的《Python入門心法》&#xff0c;輕輕撫平卷起的書角。 "小碼&#xff0c;路上小心。"父親將一把青銅匕…

Python進階(4):類與面向對象程序設計

面向對象OOPOOP:Object Oriented Programming,面向對象編程,面向對象中的對象(Obiect)&#xff0c;通常是指客觀世界中存在的對象&#xff0c;這個對象具有唯一性&#xff0c;對象之間各不相同&#xff0c;各有各的特點&#xff0c;每個對象都有自己的運動規律和內部狀態;對象與…

如何在 Shopify 中創建退貨標簽

退貨是電商運營中不可避免的一環&#xff0c;而一個順暢、透明的退貨流程&#xff0c;不僅能減少客戶投訴&#xff0c;也有助于提升顧客對品牌的信任與忠誠度。Shopify 雖然沒有內建退貨標簽自動生成功能&#xff0c;但通過合理設置與外部工具整合&#xff0c;你完全可以打造一…

I2C設備寄存器讀取調試方法

1、查看I2C掛載設備 2、讀取i2C設備所有寄存器 3、讀取i2c設備的某個寄存器 4、向i2C設備某個寄存器寫入一個值1、查看

K8S的Helm包管理器

一、背景 官網: https://helm.sh/ 我們針對K8S環境中&#xff0c;部署對應的應用&#xff0c;無外乎就是編寫一堆yaml資源清單文件. 資源清單、依賴性少的時候&#xff0c;可以直接手動維護。但是&#xff0c;隨著資源清單越來越復雜&#xff0c;越來越多&#xff0c;不同的環…

多模態數據處理新趨勢:阿里云ODPS技術棧深度解析與未來展望

多模態數據處理新趨勢&#xff1a;阿里云ODPS技術棧深度解析與未來展望 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用代碼丈…

AI數據分析儀設計原理圖:RapidIO信號接入 平板AI數據分析儀

AI數據分析儀設計原理圖&#xff1a;RapidIO信號接入 平板AI數據分析儀 1 、概述 本儀器是一款面向工業控制、新能源、震動測量等業務開發的平板AI數據分析儀。基于 Jetson Orin Nano&#xff08;AI邊緣計算&#xff09;、實現RapidIO接口數據接入&#xff0c;進行AI分析。Rap…