Swift 3中的CoreData对象为JSON
我正在努力将我的CoreData对象转换为JSON,以便我可以使用它发送到Web服务器。
这是我目前从CoreData获取对象的方式:
func fetchRecord() -> [Record] { do { records = try context.fetch(Record.fetchRequest()) } catch { print("Error fetching data from CoreData") } return records }
我可以通过这种方式显示在我的tableView上:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "recordCell", for: indexPath) as! RecordCell cell.nameLbl.text = records[indexPath.row].name cell.quantityLbl.text = "Quantity: \(String(records[indexPath.row].quantity))" cell.dateLbl.text = dateString(date: records[indexPath.row].date) return cell }
我试图像我这样在我的请求中循环:
for rec in records { print(rec) }
这给出了:
我已经阅读了很多关于实现这一目标的方法,但它们似乎都没有对我有益。 大多数示例都显示了如何将JSON提供给CoreData而不是其他方式。 有谁知道任何可以帮助我实现这一目标的好教程或文档?
在Swift 4中,您可以利用Encodable
协议并将function直接添加到Core Data对象。
假设你的NSManagedObject
子类扩展看起来像
extension Record { @NSManaged public var date: Date @NSManaged public var name: String @NSManaged public var quantity: Int32 @NSManaged public var synched: Bool @NSManaged public var uuid: String ...
采用Encodable
extension Record : Encodable {
并添加
private enum CodingKeys: String, CodingKey { case date, name, quantity, synched, uuid } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(date, forKey: .date) try container.encode(name, forKey: .name) try container.encode(quantity, forKey: .quantity) try container.encode(synched, forKey: .synched) try container.encode(uuid, forKey: .uuid) }
然后,您可以轻松地将记录编码为JSON
do { records = try context.fetch(Record.fetchRequest()) let jsonData = try JSONEncoder().encode(records) } catch { print("Error fetching data from CoreData") }
您可以使用以下代码将NSManageObject子类对象转换为字典
let record = recArray[index] let keys = Array(record.entity.attributesByName.keys) let dict = record.dictionaryWithValues(forKeys: keys)
之后,您可以使用jsonserialization将该字典转换为json对象
do{ let jsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) let reqJSONStr = String(data: jsonData, encoding: .utf8) print(reqJSONStr!) }catch{ }
希望这会有所帮助。
这里的代码作为扩展。 基于KavyaKavita的回答。
extension NSManagedObject { func toJSON() -> String? { let keys = Array(self.entity.attributesByName.keys) let dict = self.dictionaryWithValues(forKeys: keys) do { let jsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) let reqJSONStr = String(data: jsonData, encoding: .utf8) return reqJSONStr } catch{} return nil } }
用法:
let jsonString = YourCoreDataObject.toJSON() print(jsonString)
如果您愿意,可以使用以下内容从核心数据中获取字典格式的结果:
let fetchRequest = NSFetchRequest(entityName:"Record") fetchRequest.resultType = .dictionaryResultType do { records = try context.fetch(fetchRequest) } catch { print("Error fetching data from CoreData") }