[Rust] serde: JSON 2

https://blog.naver.com/sssang97/221864535670
์ด์–ด์„œ ์ž‘์„ฑํ•œ๋‹ค.

[package]
name = "just_test"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

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



์—ญ์ง๋ ฌํ™”(Deserialize)

serde์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ, ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๊ตฌ์กฐ์ฒด ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•ด์„œ ์—ญ์ง๋ ฌํ™”๋ฅผ ํ•œ๋‹ค.

๋ณ„๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์—†๋‹ค.

๊ทผ๋ฐ json ํ•„๋“œ์˜ ์ปจ๋ฒค์…˜์ด rust์˜ ์‹๋ณ„์ž ์ปจ๋ฒค์…˜๊ณผ ์‚ฌ๋ญ‡ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿด๋•Œ๋Š” rename ์†์„ฑ์œผ๋กœ ๋ช…์‹œ๋ฅผ ํ•ด์ฃผ๋Š”๊ฒŒ ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.




๋‹คํ˜•์ ์ธ ํƒ€์ž…์— ๋Œ€ํ•œ ์—ญ์ง๋ ฌํ™”

rust๋Š” enum์ด๋ผ๋Š” ํ›Œ๋ฅญํ•œ union ํƒ€์ž…์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹คํ˜•์ ์ธ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋„ ๋Œ€์‘์„ ๊ฝค๋‚˜ ์œ ์—ฐํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ, ํŠน์ • json ํ•„๋“œ์˜ ํƒ€์ž…์ด ์ด๋žฌ๋‹ค ์ €๋žฌ๋‹ค ๋ฐ”๊พธ๋Š” ๊ฒƒ๋„ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ์—ญ์ง๋ ฌํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐฉ๋ฒ•์€ ๊ทธ๋ƒฅ enum์œผ๋กœ ๊ฐ variant๋“ค์„ ์ •์˜ํ•ด์„œ ์‘ค์…”๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌ๋ฉด ๋ฐฐ์—ด์ผ ๋•Œ์™€ ๋‹จ๋… ์˜ค๋ธŒ์ ํŠธ์ผ ๋•Œ๊ฐ€ ์ „๋ถ€ ์ปค๋ฒ„๋œ๋‹ค.


์ž˜ ๋Œ์•„๊ฐ„๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ๋‹ค.

fn main() {
    #[derive(serde::Deserialize, Debug)]
    struct TestItem {
        item_id: u32,
    }

    #[derive(serde::Deserialize, Debug)]
    #[serde(untagged)]
    enum TestResponseVariant {
        Object(TestItem),
        Array(Vec<TestItem>),
    }

    #[derive(serde::Deserialize, Debug)]
    struct TestResponse {
        id: u32,
        variant: TestResponseVariant,
    }

    {
        let json_raw = r#"{"id":12, "variant": { "item_id": 1234 }}"#;
        let response: TestResponse = serde_json::from_str(json_raw).unwrap();

        println!("{:?}", response);
    }

    {
        let json_raw = r#"{"id":12, "variant": [{ "item_id": 1234 }]}"#;
        let response: TestResponse = serde_json::from_str(json_raw).unwrap();

        println!("{:?}", response);
    }
}

์ด์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๋งŽ์ด ์ œ๊ณตํ•˜๋Š” ํŽธ์ธ๋ฐ, ๋” ์ž์„ธํ•œ ๊ฒƒ์€ serde ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค.
https://serde.rs/



์ฐธ์กฐ
https://serde.rs/