There are great libraries out there that help you parse JSON data, but it is great to see how Swift 5 implements a fully-native solution to make your data types encodable and decodable for compatibility with JSON.
There are three new protocols in the Swift standard library that define an standardized approach to data encoding and decoding. These new protocols are
The easiest way to encode or decode a type is to use standard properties that are already
Codable, which can be types like
Let’s consider a
User structure that stores the name, the username and the phone number of a user.
We can make it automatically decodable and encodable by conforming to the
Codable protocol, which is a type alias of Encodable and Decodable.
We can also use custom types that also conform to the
Codable protocol, and use built-in types such as
Optional whenever they contain codable types.
Let’s add to the previous example a list of devices that the user owns. It is represented by an
Device stores the name and the manufacturer of a device.
We can now deserialize a JSON document into our
User instance, and serialize that instance back into a JSON document.
In some cases, you may not need to decode and encode the same type. For example, you may only need to read data and decode them into an instance, or you just need to make API calls and there is no need to decode the response containing the same type.
You can achieve that by conforming
Decodable protocols. The example below shows how the
User structure only encode data:
It is often the case that we parse JSON documents with properties that doesn’t match our property names. In that case, we need to define custom key names in order to parse these properties into our instances.
In order to define the custom list of key names we need to define an enumeration named
CodingKeys which conforms to the
CodingKeys protocol. The names of the enumeration cases should match the names you’ve given to the corresponding properties in your type.
Let’s update the property
phoneNumber of our
User structure, which is defined in the JSON document using snake-case style. The enumeration
CodingKeys provide the
phoneNumber alternative key specified by a
String as the raw-value type for the
If you find this post helpful, please recommend it for others to read.