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