对于以下键:值对,不适合使用
A_Geo:“多点((121.5831587 24.9971109))”
我需要支持,以转换成字典和组合成字典数组像其他对
_id:1,.....,lng: 121.5831587,lat: 24.9971109,......
为了将后面的JSON解析成lng和更高版本的地理数据,我们尝试应用JSONSerialization。但是没有更进一步的想法。
result:
{
offset: 0,
limit: 10000,
results:[
-{
_id: "1",
A_Name_Ch: “Great Hotel Spot",
A_Geo: "MULTIPOINT ((121.5831587 24.9971109))",
A_Location: “Great Spot",
A_Name_En: "Giant Great",
A_CID: "1"
}, {…}, {…}
}
]
}
let ArticlesUrl = URL (string: "http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=a3e2b221-75e0-45c1-8f97-75acbd43d613")!
let session = URLSession.shared
let task = session.dataTask(with: ArticlesUrl){(data,response,error) in
if let error = error {
print ("failed!!")
completionHandler(nil,error)
return
}
let data = data!
if let jsonObject = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as![String:[String: Any]], let articleArray = jsonObject["result"]!["results"] as? [[String: Any]]{
var articles = [Article]()
for articleDict in articleArray{
let article = Article(rawData: articleDict)
articles.append(article)
}
completionHandler(articles, nil)
}
}
task.resume()发布于 2018-06-01 14:38:07
您不能与lat and lng组合,您必须在解析它时手动执行此操作。
这是给你的信息。假设你已经解析了A_Geo值,现在你有了下面的字符串"MULTIPOINT ((121.5831587 24.9971109))",你应该这样做,
let string = "MULTIPOINT ((121.5831587 24.9971109))"
let value = string.slice(from: "((", to: "))")
let latitude = value?.components(separatedBy: " ").first
let longitude = value?.components(separatedBy: " ").last
print(latitude!, longitude!)输出将是,
("121.5831587") ("24.9971109")下面是String extension的slice泛型函数。
extension String {
func slice(from: String, to: String) -> String? {
return (range(of: from)?.upperBound).flatMap { substringFrom in
(range(of: to, range: substringFrom..<endIndex)?.lowerBound).map { substringTo in
String(self[substringFrom..<substringTo])
}
}
}
}slice是通用函数,只要您有这种类型的场景,就可以在整个应用程序的任何地方使用它。
发布于 2018-06-01 14:54:53
解析MULTIPOINT字符串表达式的另一种方法是Scanner
let string = "MULTIPOINT ((121.5831587 24.9971109))"
let scanner = Scanner(string: string)
var lat = 0.0, lng = 0.0
if scanner.scanUpToCharacters(from: CharacterSet.decimalDigits, into: nil) {
scanner.scanDouble(&lat)
scanner.scanDouble(&lng)
}
let coordinate = ["lat" : lat, "lng" : lng]发布于 2018-06-02 11:54:37
参考上面的评论和相关文章,我在Swift 4中提出了一个解决方案,虽然是有效的,但却是多余的。如果有人能改进它,我将不胜感激。
if let geo = article.geo {
print("Geo is \(geo)")
// geo = "MULTIPOINT ((121.5831587 24.9971109))"
let geo_StringA = geo.split(separator: "(", maxSplits: 3)[1]
let geo_StringB = geo_StringA.split(separator: ")", maxSplits: 3)[0]
let geo_array = geo_StringB.split(separator: " ", maxSplits: 3)
let lng_String = String(geo_array.first!) as NSString
let lng = lng_String.doubleValue
self.articles[indexPath.row].lng = lng
print("lng is \(lng)")
let lat_String = String(geo_array.last!) as NSString
let lat = lat_String.doubleValue
self.articles[indexPath.row].lat = lat
print("lat is \(lat)")
}https://stackoverflow.com/questions/50637161
复制相似问题