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