2017-09-09 42 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謝謝你的回答 –