在swift

时间:2016-08-13 20:05:59

标签: arrays json swift dictionary nsjsonserialization

我有以下对象类:

class NewsItem: NSObject {

var storyCategory: String?
var titleText: String?
var paragraph1: String?
var paragraph2: String?
var featureImage: String?
var secondImage: String?
var storyDate: String?
var majorReference: String?
var fact: String?
var actualFeatureImage: UIImage? // Using these two to pass the image from home to story view
var actualSecondImage: UIImage?

var referencesArray = [AnyObject]()
...

init?(dictionary: [String: AnyObject]) {

guard

let storyCategory = dictionary["category"] as? String,
let titleText = dictionary["title"] as? String,
let paragraph1 = dictionary["paragraph1"] as? String,
let paragraph2 = dictionary["paragraph2"] as? String,
let featureImage = dictionary["headerImage"] as? String,
let storyDate = dictionary["date"] as? String,
let majorReference = dictionary["majorReference"] as? String,
let secondImage = dictionary["secondImage"] as? String

  else {
  return nil
}

self.storyCategory = storyCategory
self.titleText = titleText
self.paragraph2 = paragraph2
self.paragraph1 = paragraph1
self.featureImage = featureImage
self.storyDate = storyDate
self.majorReference = majorReference
self.fact = dictionary["fact"] as? String //if there's a fact in the dict, it will be assigned and if not there'll be nil
self.secondImage = secondImage

let referenceObject = dictionary["reference"] as? [[String: AnyObject]]
for object in referenceObject! {

    self.referencesArray.append(object)
    //print(object)
}

//bellow is a snippet from the method that's serializing the JSON data

do {
    let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)

    if let newsArticles = json["stories"] as? [[String: AnyObject]] {
      for article in newsArticles {
        let newsArticle = NewsItem(dictionary: article)
        newsItems.append(newsArticle!)

      }
    }
  } catch {
    print("error in the news items delivery: \(error)")
    let displayError = EHPlainAlert(title: "hmmm...", message: "\(error)", type: ViewAlertError)
    displayError.show()
  }

}

在应用程序的后端,我有JSON对象,每个对象的值之一如下:

... "reference" : [
        {
            "refName": "CNN",
            "refURL": "http://edition.cnn.com/2016/07/19/football/brexit-effect-on-english-premier-league/index.html"
        },
        {
            "refName": "Telegraph",  
            "refURL": "http://www.telegraph.co.uk/football/2016/06/21/what-would-brexit-mean-for-the-premier-league/"
        }

    ], ...

我不知道我的JSON是否错误o'但我想要的是一个引用数组,每个引用都有一个引用名称(refName)和引用的url(refURL)。

我的问题是,将上面的JSON对象添加到对象类的referencesArray中的最佳方法是什么。使用字典而不是数组会更好吗?如果是这样,我应该如何重新编写代码?

如果您需要有关代码的更多详细信息,请询问并收到更新。谢谢!

修改

这里是完整的JSON:

{

"stories" : [

    {
    "title" : "English Premier League vs BREXIT: Who will win?",

    "headerImage" : "http://i2.cdn.turner.com/cnnnext/dam/assets/160117112140-rooney-goal-exlarge-169.jpg",

    "category" : "Sports",

    "paragraph1" : "Paragraph text", 

    "paragraph2" : "More text goes here",

    "date" : "21st July",

    "majorReference" : "CNN",

    "reference" : [
        {
            "refName": "CNN",
            "refURL": "http://edition.cnn.com/2016/07/19/football/brexit-effect-on-english-premier-league/index.html"
        },
        {
            "refName": "Telegraph",  
            "refURL": "http://www.telegraph.co.uk/football/2016/06/21/what-would-brexit-mean-for-the-premier-league/"
        }

    ],

    "secondImage"   :   "http://www.telegraph.co.uk/content/dam/football/2016/06/14/02-leicester-afp-xlarge_trans++Wy_u4a9GUNQgLIY2EGV3qvLCN329DeTLuwi-bwi35Bo.jpg",

    "fact" : "Talent will go missing"

    },  ...

只有一个故事......在逗号之后,是另一个故事。

1 个答案:

答案 0 :(得分:1)

首先,定义一个数据模型供您参考:

struct NewsItemReference {
    var refName: String
    var refURL: NSURL
}

然后修改您的NewsItem课程,如下所示:

class NewsItem: NSObject {
    var referencesArray = [NewsItemReference]()

    init?(dictionary: [String: AnyObject]) {
        ...
        if let references = dictionary["reference"] as? [[String: AnyObject]] {
            for object in references {
                guard let refName = object["refName"] as? String,
                      let refURLString = object["refURL"] as? String,
                      let refURL = NSURL(string: refURLString) else {
                    continue
                }

                self.referencesArray.append(NewsItemReference(refName: refName, refURL: refURL))
            }
        }
    }

如果你发现自己很快就会超出这个模型(代码太冗长了),那么看一下像ObjectMapper这样的JSON到对象映射框架。