---
# System prepended metadata

title: Type-checking JSON responses in Elixir

---

# Type-checking JSON responses in Elixir

By: lee@lunchtimelabs.io 
Date: February 23rd, 2021

## Use Structs

I was reading some data from a remote API today and I wanted to be able to type check the data as it was coming in.

Elixir has the concept of the `Struct` which can enforce some type-safety on a `Map`.

But it's not straightforward to see how to convert a JSON response to a type-checked Struct.

---

First, create a struct for the object that you wish to model, and use `@enforce_keys` to require that field be present:

```elixir
# my_app/trip.ex

defmodule Trip do
    @enforce_keys [:name]
    defstruct [:name]
end

```

When you're importing data, use the `Jason` package with `keys: atoms` [decode option](https://github.com/michalmuskala/jason/blob/v1.2.2/lib/jason.ex#L17). Structs require the keys to be atoms rather than strings.

```
data = Jason.decode!(response.body, keys: :atoms)
```

Next, we use the [`Kernel.struct!`](https://hexdocs.pm/elixir/1.12/Kernel.html#struct/2) function to create a struct. 

Make sure to use `struct!` rather than `struct`. The `struct!` variant applies rules from `@enforce_keys`  and throws an error if anything is missed.

```
struct!(Trip, data)
```

`struct!` will check:

- That all the required keys are present.
- That no extra keys are present.

Keep in mind, this will only check against *keys*, it won't type check against the *values* of the keys.
