核心数据 - NSManagedObject(带有关系)到 JSON

Luc*_*ano 5 json core-data swift

我是核心数据新手,我想将 NSManagedObject (从本地数据库获取)转换为 JSON 字符串。这是一个具有关系的简单对象,如上所示:

实体

这是我用于获取的代码:

func loadData() {
    //1
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        return
    }

    let managedContext = appDelegate.persistentContainer.viewContext

    //2
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Bill")

    //3
    do {
        let fetchedData = try managedContext.fetch(fetchRequest) as! [Bill]
    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }
}
Run Code Online (Sandbox Code Playgroud)

如何将 fetchedData 转换为 JSON 字符串?我想使用 Codable,但我不知道它是否受支持。

Joa*_*son 5

为每个类创建一个扩展并让它实现Encodable。对于罗得来说是这样的

extension Lot: Encodable {
  enum CodingKeys: String, CodingKey {
    case id
    case quantity
    case expiration
    case quantity_packages
  }

  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(id, forKey: .id)
    try container.encode(quantity, forKey: . quantity)
    try container.encode(expiration, forKey: . expiration)
    try container.encode(quantity_packages, forKey: . quantity_packages)
}
Run Code Online (Sandbox Code Playgroud)

对于比尔,请注意我lots从转换NSSetArray

extension Bill: Encodable {
  enum CodingKeys: String, CodingKey {
    case id
    case name
    case lots
  }

  public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(id, forKey: .id)
    try container.encode(name, forKey: .name)
    if let array = lots?.allObjects as? [Lot] {
        try container.encode(array, forKey: .lots)
    } // else Not sure what to do here, maybe use an empty array?
  }
}
Run Code Online (Sandbox Code Playgroud)

我无法正确测试这一点,但我希望这会有所帮助。