在 Swift 中动态构建 JSON

Posted

技术标签:

【中文标题】在 Swift 中动态构建 JSON【英文标题】:Building JSON dynamically in Swift 【发布时间】:2016-01-21 16:09:04 【问题描述】:

我正在尝试在 Swift 中构建一些 JSON。我见过一些将字典转换为 JSON 或将类转换为 JSON 的示例,但我希望能够即时将数据转换为 JSON。我还有多个要存储的对象,而不仅仅是一个(我发现的大多数示例似乎都是这样)。

这是我的代码,用于创建我要存储的对象的字典:

for topic in topics

                var relEntries = getRelevantEntries(topic.id)
                var entryItem:[String:Any] = ["":""]
                for entry in relEntries
                    var eId = ["id":entry.id]
                    var eTitle = ["title":entry.title]
                    entryItem = [
                        "id":entry.id,
                        "title":entry.title
                    ]
                
                var topicItem:[String:Any] = [
                    "id":topic.id,
                    "topicName":topic.name,
                    "entries":entryItem
                ]
            

我想创建一个 JSON 数组,其中每个对象都包含一个 int、字符串和另一个 JSON 数组。我写了一个演示表来澄清一下。

[
    id: "id",
     topicName: "topicName",
     entries:[
           id: "id", title: "title" ,
           id: "id2", title: "title2"
          ],
    id: "id2",
     topicName: "topicName2",
     entries:[
           id: "id", title: "title" ,
           id: "id2", title: "title2"
          ]
 ]

那么我该从哪里开始将我的所有主题合并到一个 JSON 数组中呢?谢谢。

【问题讨论】:

@matt,据我了解 OP,他确实在寻找一种更通用的,可能是基于反射的,为他做大量的琐碎工作的方式。 json 转换的类。 @matt,我是 ios 和 Swift 的新手。我通过查看其他人对 SO 的回答来学习。我找到了一个看起来和我一样的例子,当我尝试将我的主题数组设置为 [String:AnyObject] 而不是现在的 [String:Any] 时,我被告知我太模棱两可了。你需要一个 AnyObject 项目来运行 NSJSONSerialization。这是那个问题:***.com/questions/29512839/create-json-in-swift 你看过 SwiftyJSON 吗? "你需要一个 AnyObject 项" 每个类实例都是一个 AnyObject 实例。 TravisGriggs 如果可能的话,我正在尝试这个没有额外的库。 @matt 我没有意识到 AnyObject 是 Java 对象的 Swift 版本。谢谢你教我。当我尝试运行“NSJSONSerialization.isValidJSONObject(topicItem)”时,我被告知参数类型“[String:Any]”不符合预期的类型“AnyObject” 【参考方案1】:

您可以在自定义对象上使用序列化技术来构建代表它们的 Foundation 类型。

之后就可以使用NSJSONSerialization类生成json了。

由于您必须区分不同的课程,因此除了 handling with mirrors 之外,目前可能会概括为您工作的较少,afaik。

【讨论】:

【参考方案2】:

你说:

我想创建一个 JSON 数组,其中每个对象都包含一个 int、字符串和另一个 JSON 数组。我写了一个演示表来澄清一下。

[
    id: "id",
     topicName: "topicName",
     entries:[
           id: "id", title: "title" ,
           id: "id2", title: "title2"
          ],
    id: "id2",
     topicName: "topicName2",
     entries:[
           id: "id", title: "title" ,
           id: "id2", title: "title2"
          ]
 ]

嗯,那是什么?它是字典 (...) 的数组 ([...]),其中每个字典都有一个 id 键(带有字符串值)、一个 topicName 键(带有字符串值)和一个 entries 键,其中每个 entries 值是一个数组,其中包含两个字典,其中一个 id 键和一个 title 键(每个都有一个字符串值)。

因此,您的工作只是构建该结构并将其序列化为 JSON。那是微不足道的。在这里,作为一个模型,我将使用文字进行演示:

var d1 : [NSObject:AnyObject] = ["id":"id", "topicName":"topicName"]
var d2 : [NSObject:AnyObject] = ["id":"id2", "topicName":"topicName2"]
let dd1 = ["id":"id", "title":"title"]
let dd2 = ["id":"id2", "title":"title2"]
let arr1 = [dd1,dd2]
let arr2 = [dd1,dd2]
d1["entries"] = arr1
d2["entries"] = arr2
let arr = [d1,d2]
let d = try! NSJSONSerialization.dataWithJSONObject(arr, options: [])
let s = NSString(data: d, encoding: NSUTF8StringEncoding)
print(s!)

输出:

[
 "id":"id",
  "entries":[
    "id":"id","title":"title",   
    "id":"id2","title":"title2"
  ],
  "topicName":"topicName"
  ,
  "id":"id2",
  "entries":[
    "id":"id","title":"title",
    "id":"id2","title":"title2"
  ],
  "topicName":"topicName2"
  
 ]

我相信您会发现这正是您所要求的。现在您所要做的就是编写代码,将您的原始数据结构转换为我上面用文字构造的数据结构。

【讨论】:

以上是关于在 Swift 中动态构建 JSON的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中动态解码任意 json 字段

如何在 swift 2.0 中提取 JSON 数据以在 UITableView 中动态应用?

IOS - 如何在 Swift 3 中从 JSON 中捕获动态数组维度

动态 JSON 解码 Swift 4

如何使用 Codable 在 Swift 中使用动态文件名解析 JSON

Swift:动态地将 JSON 添加到表单元格数组中