Working with JSON in Rust - Tutorial

Elliot Forbes Elliot Forbes ⏰ 2 Minutes 📅 Dec 25, 2017

This tutorial was built using Rust Version: 1.22.1

Introduction

Most programming languages support JSON as part of the core language by default. It’s an incredibly popular data format that is used in millions of different applications.

In this tutorial we’ll be looking at how you can effectively work with JSON objects within our own Rust based systems. In order to do this we’ll be creating a very simple REST API that will do a variety of different things with JSON objects.

Serde

In this tutorial we’ll be utilizing the Serde crate which can be found here: serde. Serde is an awesome framework which can Serialize and Deserialize objects into a huge range of data formats including:

  • JSON
  • Bincode
  • YAML
  • TOML
  • BSON
  • XML
  • Redis

In order to use this you will have to add the following to your Cargo.toml.

[dependencies]
serde = "*"
serde_json = "*"
serde_derive = "*"

and then you will have to add this to your crate root:

#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_json;

Structs

If you have ever used Golang then the concept of defining struct’s that will represent our JSON objects.

#[derive(Serialize, Deserialize, Debug)]
struct Greeting {
    status: String,
    content: String
}

Serializing

Let’s take a look at how we can serialize a struct to a JSON string:

let greeting = Greeting { status: "success", content: "Hello World" };
let serialized = serde_json::to_string(&greeting).unwrap();
println!("Serialized: {}", serialized);

Deserializing

If we conversely wanted to deserialize our JSON string and convert it back to a Greeting then we could do the following:

let deserialized: Greeting = serde_json::from_str(&serialized).unwrap();
println!("Deserialized: {:?}", deserialized);

Sample Program

Let’s now put this all together and try and create a simple REST api that will return a JSON response. This JSON response will be serialized from the resp variable that we will follow the Greeting struct.

#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_json;

extern crate iron;

use iron::prelude::*;
use iron::status;

#[derive(Serialize, Deserialize, Debug)]
struct Greeting {
    status: String,
    content: String
}

fn main() {
    fn hello_world(_: &mut Request) -> IronResult<Response> {

        let resp = Greeting{status: "success".to_string(), content: "hello world".to_string()};
        let payload = serde_json::to_string(&resp).unwrap();
        Ok(Response::with((status::Ok, payload)))

    }

    Iron::new(hello_world).http("localhost:3000").unwrap();
}

Conclusion

Hopefully you found this tutorial useful! If you did or require further assistance then please let me know in the comments section below or by tweeting me @Elliot_F.