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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1929閲覧

`nil`が入ったstructをパースする時にkeyごと無くしたい!

khayashida919

総合スコア8

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2018/08/06 01:49

編集2018/08/06 02:43

前提・実現したいこと

nilが入ったstructをパースする時にkeyごと無くしたい!

該当のソースコード

swift

1 struct Locate: Codable { 2 let osaka = "osaka" 3 let tokyo: String? = nil 4 let nagoya = "nagoya" 5 } 6 7 do { 8 let locate = try JSONEncoder().encode(Locate()) 9 let json = try JSONDecoder().decode(Locate.self, from: locate) 10 print(json) 11 } catch { 12 13 }

console

1{ 2 "osaka": "osaka", 3 "tokyo": null, 4 "nagoya": "nagoya" 5}

取得したいデータ

console

1{ 2 "osaka": "osaka", 3 "nagoya": "nagoya" 4}

何かいいやり方があれば教えてください…

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

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

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

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

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

u39ueda

2018/08/06 02:13

このコードで出力されるのはLocateオブジェクト(の文字列表現)なんですが、欲しいのはJSON文字列ではないのでしょうか?
khayashida919

2018/08/06 02:39

おっしゃる通りです。json文字列に変更しました。
xAxis

2018/08/06 02:48 編集

構造体の定義そのものを変えるって出来ないはずです。質問タイトルを満たすなら別の構造体に入れ替えるとかですかね。何か根本的に違う気がするけども。
khayashida919

2018/08/06 02:57

ですよね…リクエストごとにフォーマットが異なるのはおかしいですよね…。
fuzzball

2018/08/06 02:59

nilが残っていると何に困るのでしょうか?
khayashida919

2018/08/06 03:47

>fuzzball様 サーバ側に「値のないキーは送ってくるな」と言われており困っております。システム的にサーバ側が修正するのが妥当だとは思いますが大人の都合上そうならなさそうで困っている。といった所です。
guest

回答1

0

ベストアンサー

多分JSONEncoder/JSONDecoderの使い方を勘違いしているのだと思います。

質問者さんはLocate=>JSONに変換してJSONをprintしているつもりなんだと思いますが(違っていたらごめんなさい)、提示されているコードではLocate=>JSON=>Locateと変換していて、Locateをprintしています。

本当に欲しいのはJSONでしょうから、質問のコードでいうlocate変数を使えば十分です。
locate変数はData型なので、あとはString型に変換してあげれば目的のものが手に入るはずです。

ちなみに質問タイトルの「keyごと無くしたい」ですが、下の出力を見てわかる通り値がnilのキーは最初から除外されます。

変数名とかを合わせたコードを載せておきます。

Swift

1do { 2 let jsonData: Data = try JSONEncoder().encode(Locate()) 3 let jsonString: String? = String(data: jsonData, encoding: .utf8) 4 // 不要 5 //let locate: Locate = try JSONDecoder().decode(Locate.self, from: jsonData) 6 print(jsonString ?? "nil") 7} catch { 8 9}

console

1{"osaka":"osaka","nagoya":"nagoya"}

大分推測が入っているので根本から勘違いしていたらごめんなさい。

投稿2018/08/06 03:43

u39ueda

総合スコア950

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問