Swift 3 - 如何将包含结构的结构数组转换为 JSON?

2024-03-12

我有一个数组Field我想要转换为 JSON 字符串的结构。

Field定义为:

struct Field{

    var name: String
    var center: LatLng
    var perimeter: [LatLng]

    func toDictionary() -> [String : Any]{
        let dict: [String : Any] = ["name":self.name, 
                                    "center":self.center.toDictionary(),
                                    "perimeter": ppsToDictArray()]
        return dict
    }

    fileprivate func ppsToDictArray() -> [Any]{
        var data = [Any]()
        for pp in perimeterPoints{
            data.append(pp.toDictionary())
        }
        return data
    }


}

and LatLng定义为:

struct LatLng{

    let latitude: Double
    let longitude: Double

    func toDictionary() -> [String : Any]{
        let dict: [String : Any] = ["latitude": self.latitude,
                                    "longitude": self.longitude]
        return dict
    }

}

这是我尝试将数组转换为 JSON 的地方:

    //selectedFields is a [Field] populated with some Fields
    let dicArray = selectedFields.map{$0.toDictionary()}
    if let data = try? JSONSerialization.data(withJSONObject: dicArray, options: .prettyPrinted){
        let str = String(bytes: data, encoding: .utf8)
        print(str) //Prints a string of "\n\n"
    }

如何将此类数组转换为 JSON 字符串?我尝试了一些类似的事情这个答案 https://stackoverflow.com/a/33186219/6837405,但它打印为Optional("[\n\n]")"(我明白为什么打印时显示“可选”)。在推断我的结构内结构情况后,我似乎无法让它工作。我也才刚接触 Swift 大约一个月。

编辑: 我编辑了上面的代码,以代表我正在做的事情的更完整的示例,以响应查看更多工作的请求。我最初没有包含所有内容,因为我不是在问如何修复现有代码,而是更多地询问如何使用嵌套结构进行该过程的示例。


struct LatLng {
    let latitude: Double
    let longitude: Double

    func getJSON() -> NSMutableDictionary {
        let dict = NSMutableDictionary()
        dict.setValue(latitude, forKey: "latitude")
        dict.setValue(longitude, forKey: "longitude")
        return dict
    }
}

struct Field {
    var name: String
    var center: LatLng
    var perimeter: [LatLng]

    func getJSON() -> NSMutableDictionary {
        let values = NSMutableDictionary()

        var perimeterArray = Array<NSMutableDictionary>()
        for item in perimeter {
            perimeterArray.append(item.getJSON())
        }

        values.setValue(name, forKey: "name")
        values.setValue(center.getJSON(), forKey: "center")
        values.setValue(perimeterArray, forKey: "perimeter")

        return values

    }
}

let peri = [LatLng(latitude: 10.0, longitude: 10.0), LatLng(latitude: 20.0, longitude: 20.0)]
let center = LatLng(latitude: 15.0, longitude: 15.0)

let field = Field(name: "test", center: center, perimeter: peri)

let json = try NSJSONSerialization.dataWithJSONObject(field.getJSON(), options: .PrettyPrinted)
let jsonString = NSString(data: json, encoding: NSUTF8StringEncoding)
print(jsonString)

//PRINTS THE FOLLOWING OUTPUT
Optional({
    "name" : "test",
    "center" : {
        "longitude" : 15,
        "latitude" : 15
    },
    "perimeter" : [{
        "longitude" : 10,
        "latitude" : 10
    },
    {
        "longitude" : 20,
        "latitude" : 20
    }]
})

UPDATE

为了序列化 Field 对象的数组,您可以执行类似的操作。

let field1 = Field(name: "value1", center: center, perimeter: peri)
let field2 = Field(name: "value2", center: center, perimeter: peri)
let field3 = Field(name: "value3", center: center, perimeter: peri)

let fieldArray = [field1.getJSON(), field2.getJSON(), field3.getJSON()]

let json = try NSJSONSerialization.dataWithJSONObject(fieldArray, options: .PrettyPrinted)
let jsonString = NSString(data: json, encoding: NSUTF8StringEncoding)

请注意,这只是一种快速解决方案,而不是最好的解决方案。这只是为了让您了解它将如何进行。我确信你能够在这方面有所改进。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 3 - 如何将包含结构的结构数组转换为 JSON? 的相关文章

随机推荐

  • PyCharm 中的 PyQt4 没有自动完成功能

    在我使用的办公室电脑上 Python 3 4 PyQt4 版本 4 11 1 PyCharm 社区版 3 4 1 我按照上述顺序安装了所有内容 但是 代码完成不起作用 它适用于导入 但不适用于类和方法 我做了一个小示例程序 import s
  • 如何找到最大堆栈大小?

    我正在使用 Ubuntu 11 04 如何找出进程的最大调用堆栈大小以及堆栈的每个帧的大小 快速谷歌搜索应该会显示关于这个主题的一些信息 http www cs nyu edu exact core doc stackOverflow tx
  • 如果已在下拉列表中选择了项目,则 SelectedIndexChanged 事件不会触发?

    假设我有一个包含 2 个项目的下拉列表 并且默认情况下选择第一个项目 如果我选择单击下拉列表中的第一项 有没有办法让 SelectedIndexChanged 事件仍然触发 我以为我可以通过将下拉列表的 SelectedIndex 设置为
  • ImportError:找不到入口点('console_scripts','easy_install')

    我正在尝试安装一个软件包 其中一个说明如下 但出现错误 easy install U distribute pip Traceback most recent call last File Library Frameworks Python
  • 如何知道在jetpack compose的lazyrow视口中完全可见的项目?

    我有一个包含项目的惰性行 现在 我想对每当用户滚动惰性行时在视口中完全可见的项目进行 API 调用 我尝试过以下代码 listState rememberLazyListState LaunchedEffect listState snap
  • 计算机如何记录时间? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 时间在计算机中是如何表示的 我的意思是计算机不是尽可能快地完成所有计算吗 如果事物在不同的机器上以不同的速度运行 你如何跟踪时间的流逝
  • React Native - 无法在前端导入猫鼬(但它可以从后端运行)

    我无法在前端导入猫鼬 但它在后端有效 我有一个单独的后端目录 我有一些代码可以将几个用户添加到我的数据库中 这里是 import mongoose from mongoose import User from models user con
  • 信号量和互斥量在实现上有什么区别?

    我读到互斥锁和二进制信号量仅在一方面不同 在互斥锁的情况下 锁定线程必须解锁 但在信号量中 锁定和解锁线程可以不同吗 哪一种效率更高 假设您知道信号量和互斥体之间的基本区别 为了快速 简单的同步 请使用临界区 要跨进程边界同步线程 请使用互
  • PyQt:悬停按钮时更改光标

    我正在尝试制作一个按钮 或任何其他 Qwidget 这将在悬停时更改用户光标 例如 当我将鼠标悬停在 QPushButton 上时 它会将光标从箭头更改为指向手 我正在使用 Qt 样式表 所以我不完全确定 但是有没有办法在那里做类似的事情
  • WebSockets-将图像发送到连接的客户端

    这是我在 stackoverflow com 上发表的第一篇文章 所以我会尽量简单明了 我必须使用 websockets 开发 web 应用程序的功能 我能够发送文本数据 使用websockets 但不是图像 我已经查看并尝试了不同的可能性
  • 有没有办法创建由 `std::function<>` 包装的函数的哈希值?

    我有一个 C 函数 需要一个std function作为输入参数 具体来说 一个std function
  • IE 悬停选择问题

    我和一个朋友正在尝试解决 IE 7 8 我们在这里构建了一个规范的示例 http www mathgladiator com share ie select bug hover css menus htm http www mathglad
  • 如何从音频文件中分离男声和女声(C++或Java)

    我想区分音频文件中的男声和女声并将它们分开 作为输出 我希望将两个声音分开 你能帮我一下吗 编码可以用java还是c 完成 这可能是一个非常复杂的问题 它类似于编写自己的语音识别 或识别 算法 您首先可以将音频转换为频域 这是使用快速傅立叶
  • HTML(5)/CSS 中的列布局

    HTML5 CSS 中是否有一种方法可以将列布局如下所示 并且仍然可以正确地显示文本 C1 C2 C3 C4 C5 C6 只是为了澄清 我希望能够在单个元素中编写所有文本并让 CSS 创建列 虽然这使用单个元素 但必须手动定义中断 Use
  • 无法将 SQL 查询转换为左外连接的 LINQ 查询

    问题陈述 我正在尝试将我的 Sql 之一转换为 linq 查询 但我无法获得所需的输出 谁能建议我应该做什么 SQL查询 SELECT AssetTagging AssetID AssetTagging AssetDescription R
  • 离子滚动到特定列表项

    有没有办法滚动到离子列表中的特定项目 例如在此代码笔中 https codepen io anon pen grEBQJ https codepen io anon pen grEBQJ 当我转到测试按钮时 我想滚动到带有文本 文本 的列表
  • GBM 上的 EGLDisplay

    我想通过 EGL 创建 OpenGL 上下文 由于我实际上不会绘图 所以我想将 Pbuffers 与 GBM 平台结合使用 这是代码 C99 include
  • 有没有办法在 pysvg 中添加换行符?

    考虑以下最小工作示例 from pysvg text import from pysvg builders import doc svg doc addElement text hello nWorld 150 50 doc save He
  • 是否有 WebMethod 的替代方案来绕过回发但访问会话

    因此 我正在尝试提高 ASP Net Webforms 应用程序的性能 像往常一样 回发会尽力降低性能 我开始了解 WebMethod 调用 我也设法开始工作 然而 对于我的特定场景 我需要访问会话 这在静态方法中显然是不可能的 所以现在我
  • Swift 3 - 如何将包含结构的结构数组转换为 JSON?

    我有一个数组Field我想要转换为 JSON 字符串的结构 Field定义为 struct Field var name String var center LatLng var perimeter LatLng func toDictio