【问题标题】:Create a JSON document from NSObject with SwiftyJSON使用 SwiftyJSON 从 NSObject 创建 JSON 文档
【发布时间】:2018-12-12 17:48:43
【问题描述】:

我正在尝试创建一个 JSON 对象数组,以便在之后操作并保存在 UserPreferences 中,如下所示:

[
  {
    "id" : "01",
    "title" : "Title"
  },
  {
    "id" : "02",
    "title": "Title 02"
  }
]

这是我的 NSObject 类:

class Item: NSObject {
  var _id: String = ""
  var _title: String = ""

  var id: String {
    get {
        return _id
    }
    set {
        _id = newValue
    }
  }

  var title: String {
    get {
        return _title
    }
    set {
        _title = newValue
    }
  }

}

我有这段代码可以使用 SwiftyJson 转换为 JSON,但我不能把它变成一个数组

var item: [Item] = ["array of itens already setted"]
var json: JSON = JSON([:])
for item in list {
   json["id"].string = item.id
   json["title"].string = item.title
}

这段代码只返回数组的最后一项:

{
  "id" : "01",
  "title" : "Title"
}

【问题讨论】:

  • 不要使用支持存储属性和计算属性作为不编写初始化程序的不在场证明。那太糟了。考虑到标准初始化程序需要更少的代码。在 Swift 4+ 中,SwiftyJSON 已经过时,取而代之的是 Codable 协议。
  • 为什么Item 扩展NSObject?为什么它是一个类而不是一个结构?

标签: json swift swifty-json


【解决方案1】:

问题就在这里,因为循环迭代你在同一个对象中设置值。

var item: [Item] = ["array of itens already setted"]
var json: [JSON] = [JSON([:])]. -----> this should be array not just object
for item in list {
   json["id"].string = item.id
   json["title"].string = item.title
}

改用这个:

var item: [Item] = ["array of itens already setted"]
var json: [JSON] = [JSON([:])]. -----> json array 
for item in list {
   let jsonTemp: JSON = JSON([:])
   jsonTemp["id"].string = item.id
   jsonTemp["title"].string = item.title
   json.append(jsonTemp)
}

print("[JSON OBJECT Count :: \(json.count), Informations are : \(json)]")

【讨论】:

  • 我遇到了一个问题,即 var "json" 在数组 "{ }" 的开头设置了一个空对象,但其余的都很棒
  • 我想通了,应该是这样的:var json: [JSON] = []
【解决方案2】:

我建议Item 类采用Codable 协议。 然后让JSONEncoder 完成这项工作。这样,您甚至可以将生成的 JSON 嵌套在更复杂的类型中。 另请查看this 了解如何自定义键名。

let items = [Item(), Item()]
items[0].id = "01"
items[0].title = "Title"
items[1].id = "02"
items[1].title = "Title 02"

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
print(String(data: try encoder.encode(items), encoding: .ascii)!)

/* result
[
  {
    "_id" : "01",
    "_title" : "Title"
  },
  {
    "_id" : "02",
    "_title" : "Title 02"
  }
]
*/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2015-10-18
    相关资源
    最近更新 更多