swift-codable
Implement Swift Codable models for JSON and property-list encoding and decoding with JSONDecoder, JSONEncoder, CodingKeys, and custom init(from:) or encode(to:). Use when parsing API responses, remapping keys, flattening nested JSON, handling date or data decoding strategies, decoding heterogeneous
By dpearson2699 · 3,051 installs
npx skills add dpearson2699/swift-ios-skills --skill swift-codable
Source repository · Upstream listing
Swift Codable
Encode and decode Swift types using Codable ( Encodable & Decodable ) with
JSONEncoder , JSONDecoder , and related APIs. Targets Swift 6.3 / iOS 26+.
Contents
[Decode and Verify Workflow]( decode and verify workflow)
[Basic Conformance]( basic conformance)
[Custom CodingKeys]( custom codingkeys)
[Custom Decoding and Encoding]( custom decoding and encoding)
[Nested and Flattened Containers]( nested and flattened containers)
[Heterogeneous Arrays]( heterogeneous arrays)
[Date Decoding Strategies]( date decoding strategies)
[Data and Key Strategies]( data and key strategies)
[Lossy Array Decoding]( lossy array decoding)
[Single Value Containers]( single value containers)
[Default Values for Missing Keys]( default values for missing keys)
[Encoder and Decoder Configuration]( encoder and decoder configuration)
[Codable with URLSession]( codable with urlsession)
[Codable with SwiftData]( codable with swiftdata)
[Codable with UserDefaults]( codable with userdefaults)
[Common Mistakes]( common mistakes)
[Review Checklist]( review checklist)
[References]( references)
Decode and Verify Workflow
1. Decode representative success, missing, null, malformed, acronym key, and
date fixtures.
2. On failure, inspect DecodingError , its codingPath , and the raw payload.
3. Correct only the mismatched model, key, container, or strategy; do not hide
contract failures with lossy decoding.
4. Rerun fixtures and encode/decode round trips where both directions are part
of the contract.
Basic Conformance
When all stored properties are themselves Codable , the compiler synthesizes
conformance automatically:
Prefer Decodable for read only API responses and Encodable for write only.
Use Codable only when both directions are required.
Custom CodingKeys
Rename JSON keys without writing a custom decoder by declaring a CodingKeys
enum:
Every stored property must appear in the enum. Omitting a property from
CodingKeys excludes it from encoding/decoding provide a default value or
compute it separately.
Custom Decoding and Encoding
Override init(from:) and encode(to:) for transformations the synthesized
conformance cannot handle:
Nested and Flattened Containers
Use nestedContainer(keyedBy:forKey:) to navigate and flatten nested JSON:
Chain multiple nestedContainer calls to flatten deeply nested structures.
Also use nestedUnkeyedContainer(forKey:) for nested arrays.
Heterogeneous Arrays
Load [Advanced Codable Patterns](references/codable advanced patterns.md heterogeneous arrays)
for discriminator based mixed arrays.
Date Decoding Strategies
Configure JSONDecoder.dateDecodingStrategy to match your API:
Set the matching strategy on JSONEncoder :
encoder.dateEncodingStrategy = .iso8601
Data and Key Strategies
Use key strategies only for mechanical snake case to camelCase mappings.
convertFromSnakeCase maps by spelling, not Swift acronym/initialism policy:
image url , base uri , and user id match imageUrl , baseUri , and
userId only. If the Swift model uses imageURL , baseURI , or userID ,
declare explicit CodingKeys ; the strategy will not synthesize those names.
Lossy Array Decoding
Use lossy arrays only when partial success is part of the product contract; load
[Lossy Arrays](references/codable advanced patterns.md lossy arrays).
Single Value Containers
Use singleValueContainer() for type safe primitive wrappers; see
[Single Value Wrappers](references/codable advanced patterns.md single value wrappers).
Default Values for Missing Keys
Stored defaults do not make synthesized decoding tolerate missing nonoptional
keys. Load [Missing Key Defaults](references/codable advanced patterns.md missing key defaults)
when the contract assigns explicit fallback behavior to missing or null values.
Encoder and Decoder Configuration
Keep matching strategies at the transport/file format boundary. Load
[Encoder Configuration](references/codable advanced patterns.md encoder configuration)
for nonconforming floats and property list guidance.
Codable with URLSession
Codable with SwiftData
Keep schema values typed and route persistence design to swiftdata ; see
[Persistence Boundaries](references/codable advanced patterns.md persistence boundaries).
Codable with UserDefaults
Use primitives for small preferences. Load
[Persistence Boundaries](references/codable advanced patterns.md persistence boundaries)
for a small Codable RawRepresentable / @AppStorage handoff; use a real
persistence layer for larger or durable data.
Common Mistakes
1. Not handling missing defaulted fields:
2. Failing entire array when one element is invalid:
3. Date strategy mismatch:
4. Force unwrapping decoded optionals:
5. Using Codable when only Decodable is needed:
6. Manual CodingKeys for simple snake case APIs:
Review Checklist
[ ] Types conform to Decodable only when encoding is not needed
[ ] decodeIfPresent used with defaults for optional or missing keys
[ ] keyDecodingStrategy = .convertFromSnakeCase used for simple snake case APIs, with CodingKeys retained for acronym spellings
[ ] dateDecodingStrategy matches the API date format
[ ] Arrays of unreliable data use lossy decoding to skip invalid elements
[ ] Custom init(from:) validates and transforms data instead of post decode fixups
[ ] JSONEncoder.outputFormatting includes .sortedKeys for deterministic test output
[ ] Wrapper types (UserID, etc.) use singleValueContainer for clean JSON
[ ] Generic APIResponse<T wrapper used for consistent API envelope handling
[ ] No force unwrapping of decoded values
[ ] Persistence boundary is explicit: SwiftData only for compatible noncomputed model properties, @AppStorage /UserDefaults only for small primitive or RawRepresentable preferences
References
[Advanced Codable patterns](references/codable advanced patterns.md) mixed arrays, lossy decoding, wrappers, defaults, configuration, and persistence boundaries
[Codable](https://sosumi.ai/documentation/swift/codable/) protocol combining Encodable and Decodable
[JSONDecoder](https://sosumi.ai/documentation/foundation/jsondecoder/) decodes JSON data into Codable types
[JSONEncoder](https://sosumi.ai/documentation/foundation/jsonencoder/) encodes Codable types as JSON data
[CodingKey](https://sosumi.ai/documentation/swift/codingkey/) protocol for encoding/decoding keys
[JSONDecoder.KeyDecodingStrategy.convertFromSnakeCase](https://sosumi.ai/documentation/foundation/jsondecoder/keydecodingstrategy swift.enum/convertfromsnakecase) snake case conversion behavior and limitations
[Encoding and Decoding Custom Types](https://sosumi.ai/documentation/foundation/encoding and decoding custom types/) Apple guide on custom Codable conformance
[Using JSON with Custom Types](https://sosumi.ai/documentation/foundation/archives and serialization/using json with custom types/) Apple sample code for JSON patterns
[Preserving your app's model data across launches](https://sosumi.ai/documentation/swiftdata/preserving your apps model data across launches) SwiftData model property compatibility