我正在努力将我的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而不是其他方式。有谁知道任何可以帮助我实现这个目标的好教程或文档?
答案 0 :(得分:5)
在Swift 4中,您可以利用Encodable
协议并将功能直接添加到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")
}
答案 1 :(得分:2)
您可以使用以下代码
将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{
}
希望这会有所帮助。
答案 2 :(得分:2)
这里代码作为扩展名。 根据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)
答案 3 :(得分:0)
如果您愿意,可以使用以下内容从核心数据中获取字典格式的结果:
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName:"Record")
fetchRequest.resultType = .dictionaryResultType
do {
records = try context.fetch(fetchRequest)
} catch {
print("Error fetching data from CoreData")
}