How to parse a json array with Nim

Given the following JSON, how can you parse it into a nice array to work with in Nim?

[
    {
        "name":"Sergio",
        "favoriteMovie":{
            "title":"Taxi Driver",
            "releaseYear":1976
        }
    },
    {
        "name":"Daniel",
        "favoriteMovie":{
            "title":"Frozen",
            "releaseYear":2013
        }
    }
]

It’s pretty easy, first let’s start by creating the types to marshal the json into.

type
  Movie* = object
    title*: Option[string]
    releaseYear*: Option[int]

type 
  Person* = object
    name*: Option[string]
    favoriteMovie*: Option[Movie]

Then it’s just a matter of parsing the json and using the to function to marshal into a seq[Person].

import json
import strformat
import options

type
  Movie* = object
    title*: Option[string]
    releaseYear*: Option[int]

type 
  Person* = object
    name*: Option[string]
    favoriteMovie*: Option[Movie]

let responseJson = """
[
    {
        "name":"Sergio",
        "favoriteMovie":{
            "title":"Taxi Driver",
            "releaseYear":1976
        }
    },
    {
        "name":"Daniel",
        "favoriteMovie":{
            "title":"Frozen",
            "releaseYear":2013
        }
    }
]
"""

let parsedJson = parseJson(responseJson)
let list = parsedJson.to(seq[Person])
echo $list

The output you’ll see is as expected.

@[(name: Some("Sergio"), favoriteMovie: Some((title: Some("Taxi Driver"), releaseYear: Some(1976)))), (name: Some("Daniel"), favoriteMovie: Some((title: Some("Frozen"), releaseYear: Some(2013))))]