[解決済み] Swift 4 の JSONDecoder で、見つからないキーは、オプションのプロパティである必要はなく、デフォルト値を使うことができますか?
2022-05-01 18:31:29
質問
Swift 4 では、新しい
Codable
というプロトコルがあります。を使うときは
JSONDecoder
のオプションでないプロパティをすべて要求するようです。
Codable
クラスがJSONにキーを持つかどうかで、エラーがスローされます。
私のクラスのすべてのプロパティをオプションにすることは、不必要な手間のように思えます。(プロパティがnilであることは望んでいません)。
このような方法はあるのでしょうか?
class MyCodable: Codable {
var name: String = "Default Appleseed"
}
func load(input: String) {
do {
if let data = input.data(using: .utf8) {
let result = try JSONDecoder().decode(MyCodable.self, from: data)
print("name: \(result.name)")
}
} catch {
print("error: \(error)")
// `Error message: "Key not found when expecting non-optional type
// String for coding key \"name\""`
}
}
let goodInput = "{\"name\": \"Jonny Appleseed\" }"
let badInput = "{}"
load(input: goodInput) // works, `name` is Jonny Applessed
load(input: badInput) // breaks, `name` required since property is non-optional
解決方法は?
私が好むアプローチは、いわゆるDTO(データトランスファーオブジェクト)を使うことです。 これは、Codableに準拠した構造体で、目的のオブジェクトを表します。
struct MyClassDTO: Codable {
let items: [String]?
let otherVar: Int?
}
そして、そのDTOでアプリで使いたいオブジェクトをinitするだけです。
class MyClass {
let items: [String]
var otherVar = 3
init(_ dto: MyClassDTO) {
items = dto.items ?? [String]()
otherVar = dto.otherVar ?? 3
}
var dto: MyClassDTO {
return MyClassDTO(items: items, otherVar: otherVar)
}
}
この方法は、最終的なオブジェクトを好きなようにリネームして変更できるのも良い点です。 また、手動でデコードするよりもコードが少なくて済みます。 さらに、この方法では、ネットワーク層を他のアプリから分離することができます。
関連
-
com.fasterxml.jackson.databind.exc.MismatchedInputException: インスタンスのデシリアライズができない
-
[解決済み] バイナリデータをJSON文字列で。Base64より優れたもの
-
[解決済み】Swift 4でStringのsubstringを使うには?'substring(to:)'は非推奨です。部分的な範囲から'演算子を持つ文字列スライス添字を使用してください。
-
[解決済み】Swiftのオプション値とは何ですか?
-
[解決済み] どのようにjqを使用して2つのファイルから2つのJSONオブジェクトをマージするには?
-
[解決済み] json.Marshal(struct) は "{}" を返します。
-
[解決済み] SwiftでJSON辞書の型を持つプロパティをデコードする方法 [45] デコード可能なプロトコル
-
[解決済み] Mongo コレクションを JSON 形式にダンプする
-
[解決済み] JSONオブジェクトをBufferに変換し、BufferをJSONオブジェクトに戻す。
-
[解決済み] SwiftでHTMLエンティティをデコードするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】jq: 文字列で配列のインデックスを作成できない
-
[解決済み] SQLAlchemy (psycopg2.ProgrammingError) can't adapt type 'dict'.
-
[解決済み] kubectl get pods の json フォーマットの出力を jsonpath でパースする方法
-
[解決済み] JSONでコメントを使用することはできますか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] Node.js プロジェクトの package.json ファイルを自動的にビルドする方法はありますか?
-
json.loadsがエラーを報告します。二重引用符で囲まれたプロパティ名を期待:行1列2(char 1)
-
Gulpがデモ用ライティングウィジェットを作成
-
[解決済み] jqを使用してJSONからキー名を取得する方法
-
[解決済み] JSONの容量に限界はありますか?