DEV Community

Nathan
Nathan

Posted on

9 6

Parsing Json in Rust easily from API call

JSON has become one of the most popular data interchange formats on the web, thus it's vital that server-side languages handle it well.
Actually OpenAPI specification also use JSON format.
Fortunately, working with JSON is an area where Rust excels, owing in large part to the serde and serde json crates.
When compared to other languages such as Python or Java, parsing JSON to object or list of objects is done slightly differently.

In this article I will explain how to work with JSON. I will use the previous API I wrote, check my previous article before continue.

How to use serde_json?

First of all, your dependencies should looks like this:



[dependencies]
rocket = "0.4.11"
rocket_codegen = "0.4.11"
http = "0.2"
reqwest = { version = "0.11", features = ["blocking","json"] }

serde = { version = "1", features = ["derive"] }
serde_json = "1"



Enter fullscreen mode Exit fullscreen mode

To begin, you must add the Serialize and Deserialize traits on your type. To use derive macros check if the derive: feature is enabled in your dependencies.
Here I use a method called ORM (Object–relational mapping) that consists to converts data between type systems.
My Coin structure looks like this with derive marco. On each type you have to declare this traits on your type.



#[derive(Debug, Deserialize, Serialize)]
struct Coin {
    id: String,
    symbol: String,
    market_data: MarketData
}



Enter fullscreen mode Exit fullscreen mode

I define the other struct depending on what I need based on the given JSON.



use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)]
struct CurrentPrice {
    usd: i64
}
#[derivedestruct(Debug, Deserialize, Serialize)]

struct MarketData {
    pub current_price: CurrentPrice
}


Enter fullscreen mode Exit fullscreen mode

Let's dive into the code

After sending the request to backend-api , if the status code is success, then I try to deserialize the response body using serde then saved my JSON response in the "json_value" variable.



    let json_value = resp.json::<Coin>();
        match json_value {
            Ok(value)=>{
                println!("{:?}", value.id);
                Ok(format!(" Coin:{} Symbol:{} price:{:?}" ,value.id, value.symbol,  value.market_data.current_price.usd))  
        }
        Err(value) => { Ok(format!("value{:?}",value))}

    }
    }
    else{
        let response = resp.text().unwrap();
        Ok(format!("{} is not a coin!", response))
    }


Enter fullscreen mode Exit fullscreen mode

The "json_value" variable is "Result" type so I need to unwrap it in order to get the Coin Object.
I used match then I print the desired data on the HTML page with the help of format.

This is the final result:
Image description

I finished a series of small and simple articles about API in a Rust context. I will wrote a more advanced article in the near future.

Between this you can check our API Solution at www.blstsecurity.com.

If you are interested in more topic related to Rust join our Discord Server: https://discord.gg/ajDuTJWD.

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

Image of AssemblyAI

Automatic Speech Recognition with AssemblyAI

Experience near-human accuracy, low-latency performance, and advanced Speech AI capabilities with AssemblyAI's Speech-to-Text API. Sign up today and get $50 in API credit. No credit card required.

Try the API

👋 Kindness is contagious

Immerse yourself in a wealth of knowledge with this piece, supported by the inclusive DEV Community—every developer, no matter where they are in their journey, is invited to contribute to our collective wisdom.

A simple “thank you” goes a long way—express your gratitude below in the comments!

Gathering insights enriches our journey on DEV and fortifies our community ties. Did you find this article valuable? Taking a moment to thank the author can have a significant impact.

Okay