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