[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/