2017-09-09 113 views
0

我是Coredata的新手,在我的项目中,我必须从API解析JSON,并且需要使用核心数据保存解析的JSON字典。我创建了一个名为Json的新实体并添加了一个字符串类型的属性,但是当我这样做时,它显示错误,'不可接受的属性的类型的属性:属性=“信息”;期望的类型= NSString使用Coredata保存Json字典

但我不能选择属性类型NSString,以下是我用来保存json字典使用核心数据的代码。请为我提供一个解决方案。

let session = URLSession.shared.dataTask(with: jsonRequest) { (data, response, error) in 

     if let res = response { 

      print(res) 
     } 

     if let data = data { 

      do { 

       let json = try JSONSerialization.jsonObject(with: data, options: []) as! NSDictionary 

       let NewData = NSEntityDescription.insertNewObject(forEntityName: "Json", into: context) 

       NewData.setValue(json.value(forKey:"result") , forKey:"information") 

       do { 

        try context.save() 
        print("SAVED") 
       } 

       catch { 

        print(error) 
       } 

      } 

      catch { 

       print(error) 
      } 
     } 
    } 

    session.resume() 

我的JSON数据如下

{ 

"result": [ 


     { 
      "category_name": "today" 
     }, 

     { 
      "category_name": "TechCrunch", 
      "category_image": "1500899368.jpg" 
     }, 

     { 
      "category_name": "Science Daily", 
      "category_image": "1500899358.jpg" 
     }, 

     { 
      "category_name": "ShowerThoughts", 
      "category_image": "1500899351.jpg" 
     }, 

     { 
      "category_name": "BBC", 
      "category_image": "1500899343.png" 
     }, 


     { 
      "category_name": "Goal.com", 
      "category_image": "1500899336.jpg" 
     }, 
     { 
      "category_name": "Today I Learned", 
      "category_image": "1500899329.jpg" 
     }, 


     { 
      "category_name": "Times Of India", 
      "category_image": "1500899321.png" 
     }, 


     { 
      "category_name": "MIT Technology Review", 
      "category_image": "1500899313.png" 
     }, 


     { 
      "category_name": "Business Insider", 
      "category_image": "1500458239.jpg" 
     }, 


     { 
      "category_name": "coindesk", 
      "category_image": "1500544039.jpg", 
      "data": [ 
       { 
        "category_id": "34", 
        "news_id": "215", 
        "news_quote": "", 
        "title": "Bitcoin drama", 
        "image": "2017-07-20/1500544487.jpg", 
        "date": "2017-09-07 04:10:10" 
       }, 


       { 
        "category_id": "34", 
        "news_id": "225", 
        "news_quote": "", 
        "title": "Bitcoin Price Surges", 
        "image": "2017-07-21/1500629251.jpg", 
        "date": "2017-09-07 04:10:10" 
       }, 


       { 
        "category_id": "34", 
        "news_id": "229", 
        "news_quote": null, 
        "title": "Bitcoin Prices Gain", 
        "image": "2017-07-22/1500635952.jpg", 
        "date": "2017-09-07 04:10:10" 
       } 
      ] 
     } 
    ], 
    "response": { 
     "status": "success", 
     "status_code": 1, 
     "message": "success" 
    } 
} 
+0

你可以显示你正在得到的json吗? – 3stud1ant3

+0

@ 3stud1ant3更新了我的问题 –

+0

看来结果不是字符串,它是一个数组 – 3stud1ant3

回答

1

所有首先不斯威夫特使用基金会NSArrayNSDictionary

密钥result的值是一组[String:Any]字典。使用循环创建新记录并将类别名称分配给information属性。

... 

do { 

    let json = try JSONSerialization.jsonObject(with: data) as! [String:Any] 
    if let result = json["result"] as? [[String:Any]] { 
     for category in result { 
      let newData = NSEntityDescription.insertNewObject(forEntityName: "Json", into: context) 
      newData.information = category["category_name"] as! String 
      // or if the entity is not a `NSManagedObject` subclass 
      // newData.setValue(category["category_name"] as! String, forKey:"information") 
     } 

     try context.save() 
     print("SAVED") 
    } 
} catch { 
    print(error) 
} 
  • 要还的值保存到category_image你需要在实体的第二属性。
  • 要将JSON保存在密钥data中,您需要第二个与第一个实体有关系的实体。

一些注意事项:

  • 变量名都应该以小写字母。
  • JSONSerialization行中的options参数可以省略。
  • 循环后只保存一次上下文。
  • 只能使用一个do catch块。
+0

@ vadian谢谢你的回答 –