Swift json解码丢失json对象键顺序

2023-12-04

我有一个简单的 JSON 对象:

{
    "values": {
        "a":"",
        "b":"",
        "c":"",
        "d":"",
        "e":""
    }
}

我想以这种方式将其解码为 Swift 结构,我以后可以迭代其中的键values与我收到 JSON 对象的顺序完全相同.

这在斯威夫特中可能吗?


我的尝试如下:

let json = "{ \"values\": { \"a\":\"\", \"b\":\"\", \"c\":\"\", \"d\":\"\", \"e\":\"\" } }"

struct JSS: Codable {
    var values: [String: String?]?
}

let data = json.data(using: .utf8)

do {
    let decoder = JSONDecoder()
    let jss = try decoder.decode(JSS.self, from: data!)
    jss.values?.map { print("\($0.key)") }
}
catch {
}

将打印:

b
e
a
d
c

这本身并不是 Swift 的限制。 Swift 和 JSON 字典都是无序的。 JSON 格式不保证键顺序,因此不需要解析器来保留顺序。

如果您需要有序集合,最好在 JSON 中返回键值对数组:

{
    "values": [
        {"a" : ""},
        {"b" : ""},
        {"c" : ""},
        {"d" : ""},
        {"e" : ""}
    ]
}

然后以正确的顺序存储键,以便能够根据需要迭代它们。

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

Swift json解码丢失json对象键顺序 的相关文章

随机推荐

  • 如何更新 Bitnami 堆栈中的 GitLab

    我在尝试BitNami GitLab 堆栈5 1 0 2 当我这样做的时候5 1 0 3被释放了 如何更新 Bitnami 堆栈中的 GitLab 相关带 LDAP 的 BitNami GitLab Stack 5 1 0 2 看这个 ht
  • 当我复制 laravel 项目并显示最后一个视图时出错

    我有一个 Laravel 5 3 项目 它是 5 个月前创建的 今天我复制了该项目 并对代码做了一些更改 当我编辑 Blade php 文件中的视图时 我编辑的项目向我显示了最后一个项目视图 我在新的 Laravel 项目中创建了一条新路线
  • 单击工具栏上的汉堡包图标不会打开导航抽屉

    我有这个导航抽屉工作得很好 重构我的代码我删除了所有onOptionsItemSelecteds在活动中并使所有活动继承自扩展的基本活动AppComplatActivity and 实施所有必要的方法 在此之后 即使我有 单击汉堡包图标也不
  • WPF DataGrid - 我可以使用属性装饰 POCO 以获得自定义列名称吗?

    我在 WPF 中有一个 DataGrid 并用如下数据填充它 public enum Sharing Equal SurfaceBased public class Data public bool Active get set publi
  • 无法通过反射调用带有 varargs 参数的方法 - NoSuchMethodException

    我正在尝试使用反射来调用带有可变参数的方法 并抓住了NoSuchMethodException 我不明白这里出了什么问题 Code public class ReflectionTest public ReflectionTest priv
  • SwiftUI 中的 @Binding 和 ForEach

    我不明白如何使用 Binding结合ForEach在 SwiftUI 中 假设我想创建一个列表Toggles 来自布尔数组 struct ContentView View State private var boolArr false fa
  • 将当前样式表保存到本地存储

    我知道有人问过这个问题 但没有一个帖子可以帮助我解决这个问题 所以 事情是这样的 我的网站上有两个样式表 我想将最近使用的样式表保存到本地存储 样式表之间的切换效果很好 这是我的代码 window onload function var c
  • NSCache初始化用于存储ios UIImage

    我正在使用 NSCache 来存储图像 但这里的问题是一旦我在控制器之间切换 NSCache 就会清空 我希望这些项目至少在应用程序关闭或用户注销之前一直存在 假设我有一个选项卡视图 并且我将数据中的图像存储在第一个选项卡中 当我转到第二个
  • OWL-LIST 和 RDF-LIST 之间的区别

    我无法理解 OWL LIST 和 RDF LIST 之间的区别 其次 为什么OWL DL由于OWL序列化而不支持RDF LIST 以及如何在 OWL DL 中创建 OWL LIST 正如评论中提到的 我不认为有任何称为 OWL LIST 的
  • 当报告服务遇到错误时如何设置电子邮件通知

    我有一些配置为在报告服务中通过电子邮件传送的报告 昨晚我们遇到了一些网络中断 报告服务无法连接到数据库引擎 有什么方法可以配置在无法发送订阅时发送电子邮件通知吗 我正在使用报告服务 2008 R2 当电子邮件无法发送时您想要一封电子邮件吗
  • 在 MSVS C# 项目中找不到 C++/CLI DLL 命名空间(可成功重现)

    我有类似的问题在 MSVS 中找不到 C CLI DLL 命名空间 我用的是VS2010 我有一个 C CLI 程序集 DLL 其中包含有关非托管 C 代码的托管包装器 公共引用类 代码 当我从 C 项目引用此项目时 在我的实际项目中 它是
  • 如何从给定纬度和经度的地图中检索速度限制?

    我正在尝试从 Here API 地图获取速度限制 但我找不到方法 我在网站上尝试了几个示例 但唯一有效的示例是需要路线起点和终点的示例 我想获得仅给出一个点 或一个框 的速度限制 我必须使用哪个 api 有例子吗 https route c
  • Angularfire:如何查询数组中特定键的值?

    我有以下 json 对象 posts Jk3ipZ2EFgvkABHf9IX category JavaScript date 1426008529445 heading Lorem text dsvgfjds daefsrgfs defs
  • 在 Android 上使用 Facebook API 创建自定义墙贴

    我是 Android 上的 Facebook API 新手 基本上 我想做的是为我正在开发的应用程序创建自定义墙贴 就像当您听 Shazam 歌曲时 您可以与朋友分享结果 我相信我必须创建一个自定义附件 这是我设置附件的代码 mPostBu
  • 如何在不删除回收者视图中的位置的情况下删除项目?

    我真的需要你的帮助 我用很多关键词在谷歌上搜索了很多天 但我找不到 所以 我决定向你请教 所以 就在这里 实际上 我在 RecyclerView 中有一个按钮 但是这个按钮会根据可用的数据量而重复 有 带有文本 Baca 3x Baca 4
  • gitbranch -d 和 gitbranch -D 有什么区别

    我对 git 比较新 当我从另一个分支合并我的分支后 我发现了一些问题 现在我的状态是我已经通过合并提交了这些更改 但没有推送到 origin mybranch 所以我只想删除我的本地分支 然后我使用 gitbranch d mybranc
  • 定义 Javascript 原型

    以下两种 Javascript 原型之间的功能差异是什么 选择其中一种有什么好处 选项1 Person prototype sayName function name alert name 选项2 Person prototype sayN
  • Primefaces 5.1 日历弹出窗口不执行 valueChange 事件

    我尝试以这种方式使用带有弹出窗口的 primefaces 日历
  • Swift 5 - 如何使用 PDFKit 在 PDF 中创建表格

    我在 UIGraphicsPDFRendererFormat 中有信息 高度为 400 我想在其中附加一个表格 但如果表格比页面大 我需要自动创建新页面 并继续在其他页面中使用表格 我找到了有关将 UITableView 转换为 PDF 的
  • Swift json解码丢失json对象键顺序

    我有一个简单的 JSON 对象 values a b c d e 我想以这种方式将其解码为 Swift 结构 我以后可以迭代其中的键values与我收到 JSON 对象的顺序完全相同 这在斯威夫特中可能吗 我的尝试如下 let json v