拆分字典数组中的JSON字符串

时间:2015-05-26 02:37:11

标签: arrays json string swift

我有一个使用Swifty JSON的函数。它从我的DataManager文件中检索数据,该文件从此JSON字符串http://www.kuakes.com/json/中获取信息 我的tableViewController文件中的函数将JSON分解为我需要的信息,如标题,id,时间等。我的问题是标题条目包含位置和里程表,我需要将其分解为两个单独的字符串 - 一个用于比例,一个用于定位。 喜欢这个条目:{“id”:153355,“title”:“mb 4.6 AZERBAIJAN”,“link”:“http://www.emsc-csem.org/Earthquake/earthquake.php?id = 443813”,“源 “:” http://www.kuakes.com”, “北”:0, “西”:0, “LAT”:40.799999, “LNG”:46.919998, “深度”:10, “MAG”:4.6 ,“time”:“2015-05-26 01:20:35 UTC”,“timestamp”:1432603235}

格式化:

{

    "id":153355,
    "title":"mb 4.6 AZERBAIJAN",
    "link":"http:\/\/www.emsc-csem.org\/Earthquake\/earthquake.php?id=443813",
    "source":"http:\/\/www.kuakes.com",
    "north":0,
    "west":0,
    "lat":40.799999,
    "lng":46.919998,
    "depth":10,
    "mag":4.6,
    "time":"2015-05-26 01:20:35 UTC",
    "timestamp":1432603235

}

“mb 4.6 AZERBAIJAN”,< - 我希望4.6用于比例,而阿塞拜疆用于定位。 我不知道该怎么做,这就是我的尝试:

func getEarthquakeInfo(completion: (results : NSArray?) ->Void ){


    DataManager.getEarthquakeDataFromFileWithSuccess {
        (data) -> Void in

        let json = JSON(data: data)


        if let JsonArray =  json.array {

            for appDict in JsonArray {
                var ids: String? = appDict["id"].stringValue
                var title: String? = appDict["title"].stringValue
                var time: String? = appDict["time"].stringValue
                var lattitude: String? = appDict["lat"].stringValue
                var longitude: String? = appDict["lng"].stringValue
                var information = AppModel(idEarth: ids, title: title, time: time, lat: lattitude, lng: longitude)
                var title2strings = title!.componentsSeparatedByString(" - ")
                var scale = title2strings[0]
                 var location = title2strings[1] // Error: Array index out of range
                println("\(scale)")
                self.info.append(information)
                completion(results: self.info)
            }


        }

    }

}

如果我在没有放置位置的情况下运行程序,它就会很好地打印刻度。但是,如果某些条目在比例和位置之间没有用“ - ”分隔,那么它就是我的全部内容。防爆。 M 3.1南希腊我认为这可能是我在var location = title2strings[1]

收到错误的原因

如果有人可以帮助我,我会很感激。

更新:我的最终目标是将所有标题条目分成比例和位置,即使其中一些没有用“ - ”分隔。我不能忽略那些没有分开的东西。如果有人可以建议一种方法来做到这一点,那将会有很大的帮助。

3 个答案:

答案 0 :(得分:1)

我不知道您的JSON源中的字符串格式是否一致,但如果是,您可以尝试这样的事情:

let quakes = ["mb 4.6 AZERBAIJAN", "M 3.1 Southern Greece", "M 4.8 - Norwegian Sea"]

let cset = NSCharacterSet.whitespaceCharacterSet()

var results = [(String, String)]()

for quake in quakes {
    var comps = quake.componentsSeparatedByCharactersInSet(cset)
    comps.removeAtIndex(0)
    if comps[1] == "-" {
        comps.removeAtIndex(1)
    }
    let scale = comps[0]
    comps.removeAtIndex(0)
    let loc = " ".join(comps)
    results.append((scale, loc))
}

println(results) // [(4.6, AZERBAIJAN), (3.1, Southern Greece), (4.8, Norwegian Sea)]

答案 1 :(得分:0)

问题是如果swift不能将字符串分成两部分,那么你将不会在位置[1]中得到一个结果,因为该操作只返回位于[0]位置的一个字符串,例如标题是" test"被分割成结果你会得到结果[0] = test和结果[1] = nil当你尝试读取结果[1]时你会有超出界限的错误。

var title2strings? = title!.componentsSeparatedByString(" - ")
if let scale = title2strings[0]{
    println(scale)
} else { println("No value from scale") }
if let location = title2strings[1]{
    println(location)
}  { println("No value from location") }

请记住,现在规模和位置都是可选项,您需要使用!强制它在打开之前重新打开(不安全)或再次使用if let

我希望能帮助你,祝你好运!

答案 2 :(得分:-1)

我自己想出了另一种方式。我使用stringByReplacingOccurrencesOfString替换了所有带有“ - ”的标题条目。之后,我能够分割所有字符串。

func getEarthquakeInfo(completion: (results : NSArray?) ->Void ){


    DataManager.getEarthquakeDataFromFileWithSuccess {
        (data) -> Void in

        let json = JSON(data: data)


        if var JsonArray =  json.array {
            JsonArray.removeAtIndex(0)

            for appDict in JsonArray {

                var ids: String? = appDict["id"].stringValue
                var title: String? = appDict["title"].stringValue
                var time: String? = appDict["time"].stringValue
                var lattitude: String? = appDict["lat"].stringValue
                var longitude: String? = appDict["lng"].stringValue
                let newString = title!.stringByReplacingOccurrencesOfString("  ", withString: " - ", options: NSStringCompareOptions.LiteralSearch, range: nil)
                var title2strings = newString.componentsSeparatedByString(" - ")
                var scale = title2strings[0]
                var location = title2strings[1]
                var information = AppModel(idEarth: ids, title: title, time: time, lat: lattitude, lng: longitude, scale: scale, location: location)
                self.info.append(information)
                completion(results: self.info)


             }
        }

    }

}