How to Parse a JSON String in Ruby?

You can parse a JSON string in Ruby using the JSON#parse() method, which deserializes the JSON string to equivalent Ruby data structures. You can use it like so:

require 'json'

data = JSON.parse('{"name": "John Doe", "age": 29}')

puts data['name'] # "John Doe"
puts data['age'] # 29

To see the types of the decoded objects, you can get the class name of the objects like so:

puts data['name'].class.name # String
puts data['age'].class.name # Integer

The JSON.parse() method is able to make the following JSON transformations:

JSON Ruby
object Hash
array Array
string String
number (int) Integer
number (real) Float
true true
false false
null nil

For example:

require 'json'

data = JSON.parse('{"foo":"bar"}')

# object -> Hash
puts data # {'foo': 'bar'}
puts data.class.name # Hash
require 'json'

data = JSON.parse('["foo", "bar"]')

# array -> Array
puts data # ["foo", "bar"]
puts data.class.name # Array
require 'json'

data = JSON.parse('{"foo": "bar"}')

# string -> String
puts data['foo'] # "bar"
puts data['foo'].class.name # String
require 'json'

data = JSON.parse('{"foo": 2, "bar": 1.5}')

# number (int) -> Integer
puts data['foo'] # 2
puts data['foo'].class.name # Integer

# number (real) -> Float
puts data['bar'] # 1.5
puts data['bar'].class.name # Float
require 'json'

data = JSON.parse('{"foo": true, "bar": false}')

# true -> true
puts data['foo'] # true
puts data['foo'].class.name # TrueClass

# false -> false
puts data['bar'] # false
puts data['bar'].class.name # FalseClass
require 'json'

data = JSON.parse('{"foo": null}')

# null -> nil
puts data['foo'] # nil
puts data['foo'].class.name # NilClass

In addition to these, you can make Ruby decode NaN, Infinity and -Infinity as well (even though they're not valid JSON). You can do so by passing the allow_nan option as the second (optional) argument to the JSON#parse() method, making the following JSON-to-Ruby transformations possible:

JSON Ruby
NaN NaN
Infinity Infinity
-Infinity -Infinity

For example:

require 'json'

json_str = '{"foo": NaN, "bar": Infinity, "baz": -Infinity}'
data = JSON.parse(json_str, { allow_nan: true })

# NaN -> NaN
puts data['foo']  # NaN
puts data['foo'].class.name # Float

# Infinity -> Infinity
puts data['bar']  # Infinity
puts data['bar'].class.name # Float

# -Infinity -> -Infinity
puts data['baz']  # -Infinity
puts data['baz'].class.name # Float

This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.