Кодировать строку URL в словарь В моем случае: некоторые значения имеют = внутри - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь преобразовать декодирование в словарь из приведенной ниже строки в кодировке URL.Обычный способ сделать это приведен ниже.В моем случае это не работает.Также мне нужно удалить любой символ, такой как \u{05}

let params = str.components(separatedBy: "&").map({
    $0.components(separatedBy: "=")
}).reduce(into: [String:String]()) { dict, pair in
    if pair.count == 2 {
        dict[pair[0]] = pair[1]
    }
}

Моя строка в кодировке URL

"id=sfghsgh=sbfsfhj&name=awsjdk_fs\u{05}"

Я ожидаю результата как

{ 
"id" = "sfghsgh=sbfsfhj",
"name" = "awsjdk_fs"
}

Какможно ли достичь?

1 Ответ

4 голосов
/ 23 мая 2019

Piggyback on URLComponents:

var components = URLComponents()
components.query = "id=sfghsgh=sbfsfhj&name=awsjdk_fs"

components.queryItems
// => Optional([id=sfghsgh=sbfsfhj, name=awsjdk_fs])

let list = components.queryItems?.map { ($0.name, $0.value) } ?? []
// [("id", Optional("sfghsgh=sbfsfhj")), ("name", Optional("awsjdk_fs"))]

let dict = Dictionary(list, uniquingKeysWith: { a, b in b })
// ["name": Optional("awsjdk_fs"), "id": Optional("sfghsgh=sbfsfhj")]

Если вам нужно [String: String] вместо [String: String?]:

let list = components.queryItems?.compactMap { ($0.name, $0.value) as? (String, String) } ?? []
// [("id", "sfghsgh=sbfsfhj"), ("name", "awsjdk_fs")]

let dict = Dictionary(list, uniquingKeysWith: { a, b in b })
// ["name": "awsjdk_fs", "id": "sfghsgh=sbfsfhj"]
...