質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

2655閲覧

【Swift】Objectの配列を含むParameterをURLComponentsに設定したい。

TsksHsgw

総合スコア23

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2020/05/11 10:00

編集2020/05/11 10:06

質問をご覧頂きまして、ありがとうございます。

https://hogehoge.ne.jp/fuga/index.do?params={\”key1\":1,\”key2\":{\”key3\":[{\”key4\”:1,\”key5\”:1,\”key6\":\”value6\",\”key7\":\”value7\"}]}}

上記のようにparameterにObjectの配列を含む、ちょっと複雑なURLへのGET Requestを実装する必要があり、上手くできずに困っています。

その際、「?params=」 以降のparametersを[String: Any] の形式で作成し、URLComponentsのqueryItemsとして追加したいと考えています。

もし、何かいい方法がありましたら、ご教示いただきたいです。
何卒、よろしくお願い致します。

■ 試した内容(playground)

let baseURL = URL(string: "https://hogehoge.ne.jp/")! let path = "fuga/index.do" var param: [String: Any] = [:] param["key1"] = 1 var key2Value: [String: Any] = [:] key2Value["key3"] = [(key4: 1, key5: 1, key6: "value6", key7: "value7")] // "key3" は (key4: Int, key5: Int, key6: String, key7: String)のObjectの配列となるようにしたい param["key2"] = key2Value print(param) var returnParam: [String: Any] = [:] returnParam["params"] = param // 既存の実装上、この処理を使用して実現できるとありがたいです。 func convertParameters(parameters: [String: Any]) -> [URLQueryItem] { return parameters.map { URLQueryItem(name: $0.key, value: "($0.value)") } } let url = baseURL.appendingPathComponent(path) guard var components = URLComponents(url: url, resolvingAgainstBaseURL: true) else { fatalError("invalid url") } components.queryItems = convertParameters(parameters: returnParam) print(components.queryItems) var urlRequest = URLRequest(url: url) urlRequest.url = components.url print(urlRequest.url) // Optional(https://hogehoge.ne.jp/fuga/index.do?params=%5B%22key1%22:%201,%20%22key2%22:%20%5B%22key3%22:%20%5B(key4:%201,%20key5:%201,%20key6:%20%22value6%22,%20key7:%20%22value7%22)%5D%5D%5D) // 本当は下記のように出力されるようにしたいです。 // https://hogehoge.ne.jp/fuga/index.do?params=%7B%22key1%22%3A1%2C%22key2%22%3A%7B%22key3%22%3A%5B%7B%22key4%22%3A1%2C%22key5%22%3A1%2C%22key6%22%3A%22value6%22%2C%22key7%22%3A%22value7%22%7D%5D%7D%7D

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

param を JSON 文字列にしたいってことですよね。とりあえず JSONSerialization を使ってみては。
(本来は Encodable な struct を定義して JSONEncoder を使うのが良いと思いますが…。)

swift

1import Foundation 2 3func jsonEncode(_ value: Any) throws -> String { 4 let data = try JSONSerialization.data(withJSONObject: value, options: .sortedKeys) 5 return String(data: data, encoding: .utf8)! 6} 7 8let baseURL = URL(string: "https://hogehoge.ne.jp/")! 9let path = "fuga/index.do" 10var param: [String: Any] = [:] 11param["key1"] = 1 12var key2Value: [String: Any] = [:] 13 14// "key3" の値が named tuple になっていると扱いにくいので、[String: Any] にしました。 15//key2Value["key3"] = [(key4: 1, key5: 1, key6: "value6", key7: "value7")] 16key2Value["key3"] = [["key4": 1, "key5": 1, "key6": "value6", "key7": "value7"]] 17 18param["key2"] = key2Value 19print(param) 20var returnParam: [String: Any] = [:] 21returnParam["params"] = param 22 23// 既存の実装上、この処理を使用して実現できるとありがたいです。 24func convertParameters(parameters: [String: Any]) -> [URLQueryItem] { 25 return parameters.map { URLQueryItem(name: $0.key, value: try! jsonEncode($0.value)) } 26} 27 28let url = baseURL.appendingPathComponent(path) 29guard var components = URLComponents(url: url, resolvingAgainstBaseURL: true) else { 30 fatalError("invalid url") 31} 32 33components.queryItems = convertParameters(parameters: returnParam) 34 35print(components.queryItems as Any) 36var urlRequest = URLRequest(url: url) 37urlRequest.url = components.url 38print(urlRequest.url as Any)

結果

Optional(https://hogehoge.ne.jp/fuga/index.do?params=%7B%22key1%22:1,%22key2%22:%7B%22key3%22:%5B%7B%22key4%22:1,%22key5%22:1,%22key6%22:%22value6%22,%22key7%22:%22value7%22%7D%5D%7D%7D)

投稿2020/05/11 23:51

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsksHsgw

2020/05/12 04:41

@hosi-takanoriさん ご丁寧に、且つ迅速にご返答頂きまして、ありがとうございます。 `JSONSerialization` を使用する方法があるのですね!! 本当に助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問