Данные JSON: A_Geo: "MULTIPOINT ((121.5831587 24.9971109))" необходимо проанализировать в словаре - PullRequest
0 голосов
/ 01 июня 2018

для следующей пары [ключ: значение], которая не подходит для использования

A_Geo: "MULTIPOINT ((121.5831587 24.9971109))"

Мне нужна поддержка, чтобы преобразовать ее в словарьи объединить в словарный массив, как другие пары

[_id: 1, ....., lng: 121.5831587, широта: 24.9971109, ......]

Для анализаСледуя JSON для анализа данных Geo в lng и lat, мы пытаемся применить 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()

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Альтернативой для анализа строкового выражения 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]
0 голосов
/ 02 июня 2018

Обращаясь к приведенным выше комментариям и связанным статьям, я предложил решение в 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)")
            }
0 голосов
/ 01 июня 2018

Вы не можете комбинировать с 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")

Вотslice универсальная функция String extension.

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 - универсальная функция, ее можно использовать в любом месте приложения, когда у вас есть такой сценарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...