【发布时间】:2015-10-18 18:54:14
【问题描述】:
在花了太多时间试图找到最佳实践之后,我再次在这里寻求帮助,希望我不是唯一一个为此苦苦挣扎的人:
我有这样的 NSManaged 对象:
import Foundation
import CoreData
class Credential: NSManagedObject {
@NSManaged var credentialArrivalDate: String?
@NSManaged var credentialBarCode: String?
@NSManaged var credentialComment: String?
@NSManaged var credentialCountCheckIn: Int
@NSManaged var credentialCountCheckOut: Int
@NSManaged var credentialDepartureDate: String?
@NSManaged var credentialId: String?
@NSManaged var credentialIsArrived: Bool
@NSManaged var credentialIsCheckedOut: Bool
@NSManaged var credentialIsHost: Bool
@NSManaged var credentialLastModificationDate: String?
@NSManaged var credentialMemberControlled: String?
@NSManaged var credentialNumberOfPeople: Int
@NSManaged var credentialRSVP: Int
@NSManaged var credentialTypeId: String?
@NSManaged var credentialTypeName: String?
@NSManaged var credentialZoneId: String?
@NSManaged var credentialZoneName: String?
@NSManaged var credentialHosts: Set<Host>?
@NSManaged var credentialMember: Member
@NSManaged var credentialExtensionFields: Set<ExtensionFields>?
@NSManaged var credentialDeltaFirstCheckIn: String?
@NSManaged var credentialDeltaFirstCheckOut: String?
@NSManaged var credentialIsCheckedIn: Bool
}
我与成员实体有关系:
import Foundation
import CoreData
class Member: NSManagedObject {
@NSManaged var memberCompany: String
@NSManaged var memberEMail: String
@NSManaged var memberFirstName: String
@NSManaged var memberId: String
@NSManaged var memberJob: String
@NSManaged var memberLastModificationDate: String
@NSManaged var memberLastName: String
@NSManaged var memberPhoneNumber: String
@NSManaged var memberTitle: String
@NSManaged var memberCredential: Credential
}
我要做的是使用 NSJSONSerialization.dataWithJSONObject 将我的 Credential 对象序列化为 JSON,以生成我的 JSON 并将其发布到服务器。
但是,我在序列化我的对象时遇到了一个错误,我相信这是因为我的对象不尊重这一点(来自 Apple 文档):
可以转换为 JSON 的对象必须具有以下属性:
- 顶级对象是 NSArray 或 NSDictionary。
- 所有对象都是 NSString、NSNumber、NSArray、NSDictionary 或 NSNull 的实例。
- 所有字典键都是 NSString 的实例。
- 数字不是 NaN 或无穷大。
那么如何将我的对象序列化为 JSON 呢?我是否应该找到某种方法将成员转换为字典,然后尝试找到一种方法将此字典设置为我与凭据的关系的值?
我是否错过了处理它的内置映射器?
如果不清楚,我很抱歉,但任何帮助都会非常好。
提前,谢谢。
雨果
编辑:
正如答案中所建议的,我尝试获取字典而不是 NSManagedObject 但记录的字典是空的(但是,相同的代码适用于具有一些字符串属性且没有关系的非常简单的类),这里是代码:
/*******************************
TEST : Fetch dictionary instead of NSManagedObject
*/
// create Credential entity
let newCredential = NSEntityDescription.insertNewObjectForEntityForName("Credential", inManagedObjectContext: self.managedObjectContext!) as! Credential
// create Credential entity
let newMember = NSEntityDescription.insertNewObjectForEntityForName("Member", inManagedObjectContext: self.managedObjectContext!) as! Member
// instanciate some fields
newCredential.credentialId = "44444"
newMember.memberFirstName = "TEST"
// set the relationship
newCredential.credentialMember = newMember
// retrieve currentCredential
let requestGuest = NSFetchRequest(entityName: "Credential")
// get a dictionary instead of NSManagedObject
requestGuest.resultType = NSFetchRequestResultType.DictionaryResultType
let fetchedGuest = (managedObjectContext!.executeFetchRequest(requestGuest, error:nil))! // no need to cast here ?
println(fetchedGuest.description)
/*******************************/
【问题讨论】:
-
你看过第 3 方框架,比如 RestKit 吗?
-
使用 fetchRequest.resultType = NSFetchRequestResultType.DictionaryResultType 从 coredata 中获取字典中的数据,然后序列化到 json 中。
-
对于 JSON 映射器来说是不是太多了? + 我希望尽可能使用 swift
-
@Shoaib :感谢您的回答。为了确保我理解它:如果我想从头开始创建一个 Credential 对象:我创建一个 Credential 和一个成员实体并将它们插入到我的托管对象上下文中,设置它们的成员,然后首先将成员作为字典获取?你下一步怎么做 ?我应该如何将我的会员的字典表示“关联”到我的凭证?
标签: ios json swift core-data nsjsonserialization