swift中json和字典Dict或者数组相互转换,JSONSerialization的强大使用

news2024/9/23 7:24:36

在Swift中,你可以使用JSONSerialization类将JSON字符串转换为字典。要将 Swift 字典转换为 JSON 字符串,我们可以使用JSONSerialization类的data(withJSONObject:options:)方法。这个方法将字典转换为二进制数据,然后我们可以使用String(data:encoding:)方法将其转换为字符串形式。

JSON字符串转换为字典

以下是一个例子:

// jsonStr 转为Dict
func jsonToDict() {
    print("json转为Dict")
    // 假设你有一个JSON字符串
    let jsonString = """
    {
        "name": "John Doe",
        "age": 30,
        "isDeveloper": true
    }
    """
    let jsonData = jsonString.data(using: .utf8)
    let dictData = try? JSONSerialization.jsonObject(with: jsonData!, options: []) as? [String: Any]
    print("dict data keys is:\(dictData?.keys)")
    print("dict data values is:\(dictData?.values)")
}

JSON字符串转换为数组

示例代码:

// jsonStr 转为Array
func jsonToArray() {
    print("jsonString转为数组")
    let jsonStr = """
    [
        1,
        2,
        3,
        4,
        5
    ]
    """
    let jsonData = jsonStr.data(using: .utf8)
    let arrayData = try? JSONSerialization.jsonObject(with: jsonData!, options: []) as? [Int]
    print("arrayData value is:\(arrayData)")
}

字典转为Json字符串

示例代码:

// Dict转为JsonStr
func dictToJson() {
    print("dict转为Json字符串")
    // 将字典转为JSON字符串
    let dictData = ["name": "王思聪", "city": "New York", "age": 18] as [String: Any]
    guard let jsonData = try? JSONSerialization.data(withJSONObject: dictData, options: []) else { return }
    let jsonString = String(data: jsonData, encoding: .utf8)
    print("dict转为jsonString:\(jsonString)")
}

数组转为Json字符串

示例代码:

// array转为jsonStr
func arrayToJson() {
    print("array转为Json字符串")
    let arrayData = ["name", "王思聪", "city", "New York", "age"]
    guard let jsonData = try? JSONSerialization.data(withJSONObject: arrayData, options: []) else { return }
    let jsonString = String(data: jsonData, encoding: .utf8)
    print("array转为jsonString:\(jsonString)")
}

全部的代码和效果如下:

import SwiftUI

func getFood() -> String {
    return ["🍏", "🍎", "🍐", "🍊", "🍌", "🍋", "🍉", "🍇", "🍓", "🫐"].randomElement()!
}

// json 反序列化
func jsonDecode() {
    print("json 数据解码")
    struct Person: Codable {
        let name: String
        let age: Int
        let email: String
    }
    let jsonStr = """
    {
      "name": "John",
      "age": 30,
      "email": "john@example.com"
    }
    """
    // 将json字符串转换为Data
    let jsonData = jsonStr.data(using: .utf8)
    // JSONDecoder
    let decoder = JSONDecoder()
    // 使用decoder将Data转为结构体
    let per1 = try! decoder.decode(Person.self, from: jsonData!)
    print("person name: \(per1.name)")
    print("person age: \(per1.age)")
    print("persn email: \(per1.email)")
}

// json 序列化
func jsonToStr() {
    print("json 转为字符串")
    struct Person: Codable {
        let name: String
        let age: Int
        let email: String
    }
    // 创建结构体实例
    let per2 = Person(name: "EmployA", age: 18, email: "john@example.com")
    // 创建jsonEncoder
    let jsonEncoder = JSONEncoder()
    // 将结构体实例per2转为Data
    let jsonData = try? jsonEncoder.encode(per2)
    print("jsonData: \(String(describing: jsonData))")
    // 将data转为String
    let jsonString = String(data: jsonData!, encoding: .utf8)!
    print("jsonString: \(jsonString)")
}

// jsonStr 转为Dict
func jsonToDict() {
    print("json转为Dict")
    // 假设你有一个JSON字符串
    let jsonString = """
    {
        "name": "John Doe",
        "age": 30,
        "isDeveloper": true
    }
    """
    let jsonData = jsonString.data(using: .utf8)
    let dictData = try? JSONSerialization.jsonObject(with: jsonData!, options: []) as? [String: Any]
    print("dict data keys is:\(dictData?.keys)")
    print("dict data values is:\(dictData?.values)")
}

// jsonStr 转为Array
func jsonToArray() {
    print("jsonString转为数组")
    let jsonStr = """
    [
        1,
        2,
        3,
        4,
        5
    ]
    """
    let jsonData = jsonStr.data(using: .utf8)
    let arrayData = try? JSONSerialization.jsonObject(with: jsonData!, options: []) as? [Int]
    print("arrayData value is:\(arrayData)")
}

// Dict转为JsonStr
func dictToJson() {
    print("dict转为Json字符串")
    // 将字典转为JSON字符串
    let dictData = ["name": "王思聪", "city": "New York", "age": 18] as [String: Any]
    guard let jsonData = try? JSONSerialization.data(withJSONObject: dictData, options: []) else { return }
    let jsonString = String(data: jsonData, encoding: .utf8)
    print("dict转为jsonString:\(jsonString)")
}

// array转为jsonStr
func arrayToJson() {
    print("array转为Json字符串")
    let arrayData = ["name", "王思聪", "city", "New York", "age"]
    guard let jsonData = try? JSONSerialization.data(withJSONObject: arrayData, options: []) else { return }
    let jsonString = String(data: jsonData, encoding: .utf8)
    print("array转为jsonString:\(jsonString)")
}

struct ContentView: View {
    @State var food = "🍏"

    var body: some View {
        VStack {
            Spacer()
            Spacer()
            Spacer()
            Text(food).font(.system(size: 80))
            Button(action: {
                food = getFood()
            }, label: {
                Text("今天吃啥?")
                    .padding()
                    .foregroundColor(.white)
                    .font(/*@START_MENU_TOKEN@*/ .title/*@END_MENU_TOKEN@*/)
            }).background(.orange)
                .cornerRadius(10)
            Button(action: {
                print("解码json")
                jsonDecode()
            }, label: {
                Text("解码JSON").font(/*@START_MENU_TOKEN@*/ .title/*@END_MENU_TOKEN@*/).foregroundColor(.white).padding()
            }).background(.pink).cornerRadius(10)
            Button(action: {
                jsonToStr()
            }, label: {
                Text("编码JSON").font(/*@START_MENU_TOKEN@*/ .title/*@END_MENU_TOKEN@*/).foregroundColor(.white).padding()
            }).background(.blue).cornerRadius(10)
            Button(action: {
                print("json转为dict类型")
                jsonToDict()
            }, label: {
                Text("Json转Dict").foregroundColor(.white).padding(10).font(/*@START_MENU_TOKEN@*/ .title/*@END_MENU_TOKEN@*/)
            }).background(.yellow).cornerRadius(10)
            Button(action: {
                print("json转为数组")
                jsonToArray()
            }, label: {
                Text("Json转Array").font(/*@START_MENU_TOKEN@*/ .title/*@END_MENU_TOKEN@*/).padding(10).foregroundColor(.white)
            }).background(.gray).cornerRadius(10)
            Button(action: {
                print("dict数据转为json")
                dictToJson()
            }, label: {
                Text("Dict转为Json").foregroundColor(.white).padding(10).font(/*@START_MENU_TOKEN@*/ .title/*@END_MENU_TOKEN@*/)
            }).background(.green).cornerRadius(10)
            Button(action: {
                print("字典转为数组")
                arrayToJson()
            }, label: {
                Text("Dict转数组").font(/*@START_MENU_TOKEN@*/ .title/*@END_MENU_TOKEN@*/).foregroundColor(.white).padding(10)
            }).background(.purple).cornerRadius(10)
            Spacer()
            Spacer()
            Spacer()
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1696132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode 环形链表|| 快慢指针解法

但是我们不知道 aaa 的值,该怎么办?依然是使用双指针法。考虑构建一个指针,此指针需要有以下性质:此指针和 slow 一起向前走 a 步后,两者在入口节点重合。那么从哪里走到入口节点需要 aaa 步?答案是链表头节…

SAP-CO成本控制概念之标准成本

“ 本篇介绍:标准成本的会计概念,标准成本的制定标准;通过结合会计标准成本的概念与SAP CO标准成本估算功能,更具象化的了解SAP如何实现标准成本管理,为后续学习SAP实际成本核算打下基础。” 01 — 背景需求 SAP实施…

【C++】深入解析C++智能指针:从auto_ptr到unique_ptr与shared_ptr

文章目录 前言:1. 智能指针的使用及原理2. C 98 标准库中的 auto_ptr:3. C 11 中的智能指针循环引用:shared_ptr 定制删除器 4. 内存泄漏总结: 前言: 随着C语言的发展,智能指针作为现代C编程中管理动态分配内存的一种…

infoq读书笔记-云原生时代,如何建设稳定性可观测体系?

而可观测性则是把Log、Trace、Metric拧成了一股绳,让三大支柱互相之间建立亲密的“血缘关系”,通过这种关系我们可以结构化的从整体到局部再到具体细节的观测业务: 图片来自网络如果把业务系统比作一座海上的冰山,监控仅能看到的…

02_前端三大件HTML

文章目录 HTML用于网页结构搭建1. 标签2. 客户端服务器交互流程3. 专业词汇4. html语法细节5. 安装VSCODE安装插件6. Live Server插件使用7. 标题&段落&换行&列表8. 超链接标签使用9. 图片10. 表格的写法11. 表单标签*(重点)12. 下拉框13. 页面布局标签14. 块元素和…

机器学习大模型驱动:未来的趋势与应用

文章目录 📑前言一、什么是机器学习大模型?1.1 大模型的特点1.2 大模型的技术基础 二、大模型的技术实现2.1 Transformer 架构2.2 预训练和微调2.3 模型并行和数据并行 三、大模型的应用场景3.1 自然语言处理(NLP)3.2 计算机视觉&…

02324 自学考试 离散数学屈婉玲教材 目录

02324 自学考试 离散数学屈婉玲教材 目录 02324 自学考试 离散数学屈婉玲教材 02324离散数学全程班历年真题资料

21.2zabbix低级自动发现-mysql多实例

配置mysql多实例 注释:自动发现:创建监控主机;低级自动发现:创建监控项 mysql单实例是直接yum安装,开启mysql多实例 准备配置文件 #mysql3307实例 cp /etc/my.cnf /etc/my3307.cnf vim /etc/my3307.cnf [mysqld] dat…

Maven多环境打包配置

一、启动时指定环境配置文件 在启动springboot应用的jar包时,我们可以指定配置文件,通常把配置文件上传到linux服务器对应jar包的同级目录,或者统一的配置文件存放目录 java -jar your-app.jar --spring.config.location/opt/softs/applicat…

4.Redis之Redis的通用命令

0.Redis 实战操作 通过 redis-cli 客户端和 redis 服务器交互 涉及到很多的 redis 的命令 【redis 的命令非常非常多!!! 1.掌握常用命令(多操作多练习) 2.学会使用 redis 的文档-> 阅读文档, 是程序猿的基操!! redis 的命令非常非常多!!! 1.掌握常用命令(多操作多练习…

Golang文件操作

文章目录 文件操作基本介绍普通的文件操作方式(os包)带缓冲的文件操作方式(bufio包)文件拷贝操作(io包) 命令行参数基本介绍解析命令行参数(flag包) JSON基本介绍JSON序列化JSON反序…

【手把手带你搓组件库】从零开始实现Element Plus

从零开始实现Element Plus 前言亮点项目搭建1、创建项目初始化monorepo创建 .gitignore目录结构安装基础依赖配置文件创建各个分包入口utilscomponentscoreplaytheme 2、创建VitePress文档3、部署到Github Actions生成 GH_TOKENGitHub Page 演示 4、总结 前言 在本文中&#xf…

vim操作手册

vim分为插入模式、命令模式、底行模式。 插入模式:编辑模式 命令模式:允许使用者通过命令,来进行文本的编辑控制 底行模式:用来进行让vim进行包括但不限于shell进行交互 w:保存 wq&am…

北邮22级信通院DSP:用C++程序实现给定参数下四种滤波器的Butterworth模拟滤波器设计:给定上下截频和衰减系数求H(p)和H(s)

北邮22信通一枚~ 跟随课程进度更新北邮信通院DSP的笔记、代码和文章,欢迎关注~ 获取更多文章,请访问专栏: 北邮22级信通院DSP_青山入墨雨如画的博客-CSDN博客 目录 一、 核心算法 1.1判断滤波器类型 1.2 带通滤波器BP 1.3带阻滤波器B…

十二、shell编程之awk

12.1 什么是awk 虽然sed编辑器是非常方便自动修改文本文件的工具,但其也有自身的限制。通常你需要一个用来处理文件中的数据的更高级工具,它能提供一个类编程环境来修改和重新组织文件中的数据。这正是awk能够做到的。 awk程序是Unix中的原始awk程序的…

P4097 【模板】李超线段树 / [HEOI2013] Segment 题解

题意 有一个平面直角坐标系,总共 n n n 个操作,每个操作有两种: 给定正整数 x 0 , y 0 , x 1 , y 1 x_0,y_0,x_1,y_1 x0​,y0​,x1​,y1​ 表示一条线段的两个端点。你需要在平面上加入这一条线段,第 i i i 条被插入的线段的标…

【面试干货】完全平方数

【面试干货】完全平方数 1、实现思想2、代码实现 💖The Begin💖点点关注,收藏不迷路💖 一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少? 1、…

设计模式 17 组合模式 Composite Pattern

设计模式 17 组合模式 Composite Pattern 1.定义 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设…

wps使用(解决毕业论文)

目录自动生成 页码自动生成 一部分使用I II III IV 格式,一部分使用1,2,3,4 格式 先设置全部文章为I II III IV 格式,然后再需要的地方再设置1,2,3,4 格式 一键设置中文、英文、数…

特斯拉FSD的「端到端」到底能不能成?

引言 近年来,特斯拉的全自动驾驶(Full Self-Driving,FSD)技术备受关注,尤其是其「端到端」的AI软件框架更是引发了广泛讨论。端到端技术到底是一条正确的路径吗?它能否真正实现完全自动驾驶?本…