使用 SwiftyJSON 从 NSObject 创建一个 JSON 文档

Create a JSON document from NSObject with SwiftyJSON

我正在尝试创建一个 JSON 对象数组,然后在 UserPreferences 中进行操作和保存,如下所示:

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

这是我的 NSObject class:

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
}

此代码 return 只是数组的最后一项:

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

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

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)]")

我建议 class 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"
  }
]
*/