2

我正在从 URL 获取数据。数据以 JSON 形式出现。我想将该 JSON 作为字符串保存在 Core Data 中。我怎样才能做到这一点 ?(我的 JSON 是一个 NSDictionary 对象,运行后它说

Terminating app due to uncaught exception 'NSInvalidArgumentException',reason:'Unacceptable type of value for attribute: property = "cat_list"; desired type =    NSString; given type = __NSCFDictionary;
4

5 回答 5

1

使用https://github.com/stig/json-framework/,并为你字典使用

NSString* jsonString = [jsonDict JSONRepresentation];

正如核心数据所期望的那样NSString,而不是NSDictionary.

于 2013-02-13T05:44:05.563 回答
1

您需要将数据转换为字符串并将其存储到核心数据中。

像这样:

NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

现在保存jsonString到核心数据。

于 2013-02-13T06:19:34.877 回答
1

您可以将核心数据模型中的属性类型指定为Transformable,然后直接将 NSDictionary 对象传递给它。

如果您正在创建一个NSManagedObject子类来处理对象,该属性将作为id您的子类中的类型出现(您可以选择将其更改为NSDictionary在以后访问对象时直接使用对象上的字典函数)。

注意:这是一种替代解决方案,不会将字典对象转换为字符串。

于 2013-02-13T07:32:10.180 回答
0

请注意,JSON 规范声明键的顺序不是固定的。结果是键会不时混合,这使得使用谓词检索 JSON 对象变得不可能。在使用 NSJsonSerialization 生成用于在 Core Data 中存储/检索的 NSString 后,我遇到了这个问题:键的顺序每次都不同,因此我无法检查该 JSON 消息是否已经存在。

另请参阅https://stackoverflow.com/a/15125704/876903

我决定创建一个 NSDictionary 类别,将所有键和值递归地放入有序数组中,然后用于查看与核心数据对象中的这些 NSString 一起存储的 NSDictionary 对象是否已经存储。

因此,我的核心数据对象包含:

  • 键(排序的 NSString)
  • 值(排序的 NSString)
  • 消息(可转换的 NSDictionary)

我会使用谓词来查看 JSON 对象是否像这样存在:

[NSPredicate predicateWithFormat:@"(keys == %@) AND (values == %@)", sortedKeys, sortedValues];
于 2013-11-14T13:19:58.790 回答
0

运行函数 testThis() 来查看这一切。self.user.jsonTest 是一个可转换类型的核心数据变量。将其替换为任何可转换的 CoreData 变量,并且 storeJSON 和检索 JSON 应该可以工作。我正在使用 swiftyJSON,但如果你不使用它应该非常容易删除它。

func testThis() {
    makeFakeData() {
        self.retrieveJSON(self.user.jsonTest) {
            json in
            print("json: \(json)")
        }
    }
}

func storeJSON(dataToStore: [String: AnyObject], completion: (data: NSData?) -> Void) {
    do {
        let data = try NSJSONSerialization.dataWithJSONObject(dataToStore, options: [])
        completion(data: data)
    } catch let error as NSError {
        print("NSJSONSerialization Error: \(error)")
        completion(data: nil)
    }
}

func retrieveJSON(dataToGet: NSObject?, completion: (json: JSON?) -> Void) {
    if let data = dataToGet as? NSData {
        do {
            let nsJSON = try NSJSONSerialization.JSONObjectWithData(data, options: [])
            completion(json: JSON(nsJSON))
        } catch let error as NSError {
            print("NSJSONSerialization Error: \(error)")
            completion(json: nil)
        }
    }
}

func makeFakeData(completion: () -> Void) {
    var solarResourceDic: [String: String] = [:]
    var srDics: [[String: String]!] = []

    for i in 0..<5 {
        solarResourceDic = [:]
        solarResourceDic["system_capacity"] = "\(i)"
        solarResourceDic["azimuth"] = "\(i + 1)"
        solarResourceDic["tilt"] = "\(i + 2)"
        solarResourceDic["array_type"] = "\(i + 3)"
        solarResourceDic["module_type"] = "\(i + 4)"
        solarResourceDic["losses"] = "\(i + 5)"
        srDics.append(solarResourceDic)
    }
    let dic = ["Solar Resource": srDics]

    storeJSON(dic) {
        data in
        self.user.jsonTest = data
        appDelegate.coreData.saveContext()
    }
    completion()
}
于 2016-09-01T23:00:44.443 回答