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

在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 SwiftUIfunc getFood() -> String {return ["🍏", "🍎", "🍐", "🍊", "🍌", "🍋", "🍉", "🍇", "🍓", "🫐"].randomElement()!
}// json 反序列化
func jsonDecode() {print("json 数据解码")struct Person: Codable {let name: Stringlet age: Intlet email: String}let jsonStr = """{"name": "John","age": 30,"email": "john@example.com"}"""// 将json字符串转换为Datalet jsonData = jsonStr.data(using: .utf8)// JSONDecoderlet 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: Stringlet age: Intlet email: String}// 创建结构体实例let per2 = Person(name: "EmployA", age: 18, email: "john@example.com")// 创建jsonEncoderlet jsonEncoder = JSONEncoder()// 将结构体实例per2转为Datalet jsonData = try? jsonEncoder.encode(per2)print("jsonData: \(String(describing: jsonData))")// 将data转为Stringlet 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.mzph.cn/news/841024.shtml

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

相关文章

Day23:Leetcode:530.二叉搜索树的最小绝对差 + 501.二叉搜索树中的众数 + 236. 二叉树的最近公共祖先

LeetCode:530.二叉搜索树的最小绝对差 问题描述 解决方案: 1.思路 中序遍历 2.代码实现 class Solution {int pre;int ans;public int getMinimumDifference(TreeNode root) {ans Integer.MAX_VALUE;pre -1;dfs(root);return ans;}public void d…

Unity射击游戏开发教程:(26)创建绕圈跑的效果

unity游戏 在本文中,我将介绍如何为敌人创建圆周运动。gif 中显示的确切行为是敌人沿着屏幕向下移动,直到到达某个点,一旦到达该点,它就会绕圈移动。

从浮点数定义到FP8: AI模型中不同的数据类型

背景:AI模型中不同的数据类型对硬件算力和内存的需求是不同的,为了提高模型在硬件平台的吞吐量,减少数据通信带宽需求,往往倾向于将高位宽数据运算转向较低位宽的数据运算。本文通过重新回顾计算机中整数和浮点数的定义&#xff0…

HCIP-Datacom-ARST自选题库__ISIS简答【3道题】

1.IS-1S是链路状态路由协议,便用SPF算法进行路由计算。某园区同时部署了IPv4和IPV6井运行IS-IS实现网络的互联互通,如图所示,该网络IPv4和IPV6开销相同,R1和R4只支持IPV4。缺省情况下,计算形成的IPv6最短路径树中&…

python数据分析——字符串和文本数据2

参考资料:活用pandas库 1、字符串格式化 (1)格式化字符串 要格式化字符串,需要编写一个带有特殊占位符的字符串,并在字符串上调用format方法向占位符插入值。 # 案例1 varflesh wound s"Its just a {}" p…

solidworks画螺母学习笔记

螺母 单位mm 六边形 直径16mm,水平约束,内圆直径10mm 拉伸 选择两侧对称,厚度7mm 拉伸切除 画相切圆 切除深度7mm,反向切除 拔模角度45 镜像切除 倒角 直径1mm 异形孔向导 螺纹线 偏移打勾,距离为2mm…

java:static关键字用法

在静态方法中不能访问类的非静态成员变量和非静态方法, 因为非静态成员变量和非静态方法都必须依赖于具体的对象才能被调用。 从上面代码里看出: 1.静态方法不能调用非静态成员变量。静态方法test2()中调用非静态成员变量address,编译失败…

从容应对亿级QPS访问,Redis还缺少什么?no.29

众所周知,Redis 在线上实际运行时,面对海量数据、高并发访问,会遇到不少问题,需要进行针对性扩展及优化。本课时,我会结合微博在使用 Redis 中遇到的问题,来分析如何在生产环境下对 Redis 进行扩展改造&…

算法金 | Dask,一个超强的 python 库

本文来源公众号“算法金”,仅用于学术分享,侵权删,干货满满。 原文链接:Dask,一个超强的 python 库 1 Dask 概览 在数据科学和大数据处理的领域,高效处理海量数据一直是一项挑战。 为了应对这一挑战&am…

滑动菜单栏

效果如下&#xff1a; NavigationView 新建menu布局,表示菜单栏的选项 <menu xmlns:android"http://schemas.android.com/apk/res/android"> <group android:checkableBehavior"single"> <item android:id"id/navCall" android…

海外CDN加速方式

随着全球化经济的进一步推进和互联网时代的到来&#xff0c;给对外贸易行业带来了巨大的商机&#xff0c;众多传统的贸易公司都纷纷建立起自已的外贸网站或服务站点等各种信息化平台&#xff0c; 相当多的贸易公司也从他们所构建的平台中得到了很高的利益&#xff0c;然而由于当…

医疗科技:UWB模块为智能医疗设备带来的变革

随着医疗科技的不断发展和人们健康意识的提高&#xff0c;智能医疗设备的应用越来越广泛。超宽带&#xff08;UWB&#xff09;技术作为一种新兴的定位技术&#xff0c;正在引领着智能医疗设备的变革。UWB模块作为UWB技术的核心组成部分&#xff0c;在智能医疗设备中发挥着越来越…

抖音运营_打造高流量的抖音账号

目录 一 账号定位 行业定位 用户定位 内容定位 二 账号人设 我是谁? 我的优势 我的差异化 三 创建账号 名字 头像 简介 四 抖音养号 为什么要养号&#xff1f; 抖音快速养号 正确注册抖音账号 一机一卡一号 实名认证 正确填写账号信息 养号期间的操作 五…

韵搜坊 -- Elastic Stack快速入门

文章目录 现有问题Elastic Stack介绍&#xff08;一套技术栈&#xff09;安装ES安装KibanaElasticsearch概念倒排索引Mapping分词器IK分词器&#xff08;ES插件&#xff09;打分机制 ES的几种调用方式restful api调用&#xff08;http 请求&#xff09;kibana devtools客户端调…

程序员做推广?我劝你别干

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 这是卢松松会员专区&#xff0c;一位会员朋友的咨询&#xff0c;如果你也有自研产品&#xff0c;但不知道如何推广&#xff0c;一定要阅读本文!强烈建议收藏关注&#xff0c;因为你关注的人&#xff0c;决定你看到的…

【机器学习300问】98、卷积神经网络中的卷积核到底有什么用?以边缘检测为例说明其意义。

卷积核是用于从输入数据中提取特征的关键工具。卷积核的设计直接关系到网络能够识别和学习的特征类型。本文让我以边缘检测为例&#xff0c;带大家深入理解卷积核的作用。 一、卷积核的作用 卷积核&#xff0c;又称为过滤器&#xff0c;本质上是一个小的矩阵&#xff0c;其元素…

微信小程序毕业设计-智慧旅游平台系统项目开发实战(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

【算法】二分算法——山脉数组的峰顶索引

该题用二分算法解“山脉数组的峰顶索引”&#xff0c;有需要借鉴即可。 目录 1.题目2.总结 1.题目 题目链接&#xff1a;LINK 暴力求解很简单&#xff0c;这里不再提及。 这个可以根据峰顶值分为两部分&#xff0c;因而具有“二段性”&#xff0c;可以用二分算法&#xff0c…

默认路由实现两个网段互通实验

默认路由实现两个网段互通实验 **默认路由&#xff1a;**是一种特殊的静态路由&#xff0c;当路由表中与数据包目的地址没有匹配的表项时&#xff0c;数据包将根据默认路由条目进行转发。默认路由在某些时候是非常有效的&#xff0c;例如在末梢网络中&#xff0c;默认路由可以…

Postgresql源码(133)优化器动态规划生成连接路径的实例分析

物理算子的生成分为两步&#xff0c;基表的扫描路径生成set_base_rel_pathlists&#xff1b;连接路径生成&#xff08;make_rel_from_joinlist动态规划&#xff09;。本篇简单分析实现。看过代码会发现&#xff0c;“基表的扫描路径生成”其实就是作为连接路径生成dp计算的第一…