Converter JSON para um Objeto Ruby

Quem nunca quis validar um JSON usando as validações do ActiveModel do Rails? Mas transformar um JSON multinível em um objeto Ruby parece ser um passo chato de realizar, né? Bom, hoje eu descobri que não.

Exemplo de um JSON bem simples

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  "id": "740b3e24-8686-48b6-9eb0-1b09d04bf18e",
  "name": "Carl Johnson",
  "document": "12345",
  "addresses": [
    {
      "street": "414, East 137th Street",
      "neiborhood": "Compton",
      "city": "Los Angeles",
      "state": "CA",
      "zipcode": "90061"
    }
  ]
}

Importando o JSON para uma classe

1
2
3
4
5
6
7
8
9
10
11
12
13
class AccountFromJson < OpenStruct
  include ActiveModel::Validations

  validates :name, :document, presence: true
end


json = File.read('./any/path/file.json')
account = JSON.parse json, object_class: AccountFromJson

account.valid? # => true
account.name # => "Carl Johnson"
account.addresses[0].street # => "414, East 137th Street"

Ah, e Também funciona se no JSON for um array.

Pois é, quem diz que macaco velho não aprende “novos” truques?

Referências: