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 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()
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20 VUE学习:插件

介绍 插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。下面是如何安装一个插件的示例: import { createApp } from vueconst app createApp({})app.use(myPlugin, {/* 可选的选项 */ })一个插件可以是一个拥有 install() 方法的对象,也可以直接…

股票量化交易上手,一个特别简单却长期可用的交易策略,官方接口

股票实现程序化自动化交易的三个基础:获取数据、执行交易、查询账户。 以后说到策略示例的时候就不介绍接口的基础使用方法了,随便一个策略把过程写出来都会很啰嗦,尽量压缩内容吧,这些内容是面向新手的,大佬们忽略细节…

基于51单片机的酒精浓度检测仪的设计

一.硬件方案 硬件部分为利用MQ3气敏传感器测量空气中酒精浓度,并转换为电压信号,经A/D转换器转换成数字信号后传给单片机系统,由单片机及其相应外围电路进行信号的处理,显示酒精浓度值以及超阈值声光报警。电路主要由51单片机最小…

自学SPSS,有哪些教学视频或书籍推荐?

书籍推荐 经过长达八年的不断迭代与优化,SPSSAU的用户群体已经远超简单的数据分析层面,而是逐步深入到了学术研究的精髓之中。如今,无论是在SCI、EI等国际权威学术期刊,还是北大核心期刊、CSSCI等国内顶尖学术期刊上,…

Django学习

1.pycharm社区版创建django PyCharm社区版如何创建Django项目并运行_pycharm社区版打开django-CSDN博客 2.Django TemplateDoesNotExist: rest_framework 当我们使用djangorestframework框架时,首先下载pip install djangorestframework 参考博文Django Templat…

LeetCode算法题:560. 和为 K 的子数组(Java)

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2示例 2: 输入:nums [1,2,3], …

做视频号小店和达人对接的好,爆单少不了!

大家好,我是喷火龙。 目前,视频号是没有什么自然流量的,所以,想要出单、爆单的话,靠达人带货的方式才是最可靠的,靠达人带货是肯定要对接达人,并和达人沟通带货的。 下面给大家讲一讲应该怎么…

Vue 前端加框 给div加红色框框 js实现

实现方式&#xff1a;用getElementsByClassName、createElement、appendChild实现在原有div上添加一个新的div&#xff0c;从而达到框选效果 <template><div><el-button click"addIten">添加</el-button><el-button click"deleteIt…

云动态摘要 2024-05-29

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]大模型知识引擎体验招募 腾讯云 2024-05-21 大模型知识引擎产品全新上线&#xff0c;为回馈新老客户&#xff0c;50万token免费送&#xff0c;开通服务即领取&#xff01; 云服…

摩尔线程MTT S4000 AI GPU助力30亿参数大模型训练,性能比肩英伟达同类解决方案

中国国产GPU制造商摩尔线程(Moore Threads)在AI加速器领域取得了显著进展&#xff0c;其最新推出的MTT S4000 AI GPU在训练大规模语言模型时表现突出&#xff0c;据称相较于其前代产品有着显著的性能提升。根据cnBeta的报道&#xff0c;搭载S4000 GPU的全新“酷鹅千卡智能计算集…

贷款借钱平台 小额贷款系统开发小额贷款源码 贷款平台开发搭建

这款是贷款平台源码/卡卡贷源码/小贷源码/完美版 后台51800 密码51800 数据库替换application/database.php程序采用PHPMySQL&#xff0c;thinkphp框架代码开源&#xff0c;不加密后台效果&#xff1a;手机版效果 这款是贷款平台源码/卡卡贷源码/小贷源码/完美版 后台51800 密码…

SAP 生产订单报工函数BAPI_PRODORDCONF_CREATE_TT不返回报错信息

最近财务一直反馈MES报工的数据都没有成本,然后去查看原因发现是财务当月的KP26的价格没有进行维护,导致没有收集到工单的报工成本。 但是在前台操作CO11 报工的时候,系统会给出报错的信息 但是我们在调用函数BAPI_PRODORDCONF_CREATE_TT的时候,系统并没有返回报错的信息…

【Qt秘籍】[005]-Qt的首次邂逅-创建

一、如何创建文件&#xff1f; 当我们打开Qt Creator&#xff0c;你会发现整个界面类目繁多。现在&#xff0c;让我们直接开始新建一个项目。 1.点击左上角的“文件”>点击“新建文件或项目” 2.如图&#xff0c;选择“Application”>“Qt Wifgets application”> “…

C++ list类

目录 0.前言 1.list介绍 1.1优势 1.2劣势 1.3容器属性 2.list使用 2.1构造函数 2.1.1默认构造函数 2.1.2填充构造函数 2.1.3范围构造函数 2.1.4拷贝构造函数 2.1.5初始化列表构造函数 2.2迭代器 2.2.1 begin() 2.2.2 end() 2.2.3 cbegin() 2.2.4 cend() 2.2.…

Sectigo证书介绍以及申请流程

Sectigo (原Comodo CA)是全球SSL证书市场占有率最高的CA公司&#xff0c;目前将近40%的SSL证书用户选择了Sectigo。由于其产品安全&#xff0c;价格低&#xff0c;受到大量站长的信任和欢迎。Sectigo旗下的SSL证书品牌包括Sectigo, Positive SSL, Sectigo Enterprise等。 品牌…

AI虚拟试穿革命:I2VEdit技术引领电商视频内容创新

在当今快速迭代的电子商务领域,用户体验与内容创新是企业竞争力的核心要素。随着AI技术的飞速进步,AI虚拟试穿已不再局限于静态图像,而是迈向了动态视频的新纪元。本文将深入解析一项革新性技术——I2VEdit,如何以其独到之处,为电商尤其是服装零售行业带来一场内容创作与产…

RAG 高级应用:基于 Nougat、HTML 转换与 GPT-4o 解析复杂 PDF 内嵌表格

一、前言 RAG&#xff08;检索增强生成&#xff09;应用最具挑战性的方面之一是如何处理复杂文档的内容&#xff0c;例如 PDF 文档中的图像和表格&#xff0c;因为这些内容不像传统文本那样容易解析和检索。前面我们有介绍过如何使用 LlamaIndex 提供的 LlamaParse 技术解析复…

手摸手教你uniapp原生插件开发

行有余力,心无恐惧 这篇技术文章写了得有两三个礼拜,虽然最近各种事情,工作上的生活上的,但是感觉还是有很多时间被浪费.还记得几年前曾经有一段时间7点多起床运动,然后工作学习,看书提升认知.现在我都要佩服那会儿的自己.如果想回到那种状态,我觉得需要有三个重要的条件. 其…

安卓赤拳配音v1.0.2Ai配音神器+百位主播音色

Ai配音神器 本人自用版本&#xff01;超级稳定&#xff01;百位主播音色 登陆即可用 链接&#xff1a;https://pan.baidu.com/s/1WVsrYZqLaPAriHMMLMdPBg?pwdz9ru 提取码&#xff1a;z9ru

【数据结构与算法 | 链表篇】力扣876

1. 力扣876 : 链表的中间节点 (1). 题 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表…