[Rust] serde: JSON

serde๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐํ˜•์‹๋“ค์„ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”ํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ฉ‹์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.
JSON, BSON, YAML, TOML, URL ๋“ฑ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ํ˜•์‹์„ ์ง€์›ํ•œ๋‹ค.

์šฐ์„ ์€ ์ด์ค‘์—์„œ ๊ฐ€์žฅ ๋œจ๊ฑฐ์šด ํฌ๋งท์ธ JSON์„ ๋จผ์ € ๋‹ค๋ค„๋ณด๊ฒ ๋‹ค.

๋จผ์ € serde_json์„ ์ข…์†์„ฑ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

๊ทธ๋Ÿผ ๋ฐ‘์ค€๋น„๋Š” ๋์ด๋‹ค.



๋ฌธ์ž์—ด->๊ฐ์ฒด

json ๋ฌธ์ž์—ด์—์„œ json ๊ฐ์ฒด๋ฅผ ๋ฝ‘์•„๋‚ด๋Š” ๊ฒƒ๋ถ€ํ„ฐ ํ•ด๋ณด์ž.

json ๊ทœ๊ฒฉ์„ ์ถฉ์กฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด๋ดค๋‹ค.

์ €๊ฑธ ํŒŒ์‹ฑํ•˜๋ ค๋ฉด from_str ๋“ฑ์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

Value๋Š” ์žฌ๊ท€์ ์œผ๋กœ ์ •์˜๋œ ์—ด๊ฑฐ ํƒ€์ž…์ด๋‹ค.
๊ทธ๋ž˜์„œ ๋ชจ๋“  json ๊ฐ์ฒด๋Š” Value ํƒ€์ž…์ด๊ธฐ๋„ ํ•˜๋‹ค.

์—ฌํŠผ, ์ถ”์ถœ๋œ Value ๊ฐ์ฒด์—์„œ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด, ๊ทธ๋ƒฅ ํ•ด๋‹น ์š”์†Œ์˜ ์ด๋ฆ„์œผ๋กœ ์ธ๋ฑ์‹ฑ์„ ํ•˜๋ฉด ๋œ๋‹ค.
๊ทธ๋Ÿผ ๋‹ค์‹œ ํ•ด๋‹น ์š”์†Œ๋ฅผ Value๋กœ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทผ๋ฐ ์ „๋ถ€ Value๋กœ๋งŒ ํ‰์ณ์„œ๋Š” ์ œ๋Œ€๋กœ๋œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
Value๋ผ๋Š” ๊ป์งˆ์„ ๋ฒ—๊ฒจ์„œ ๊ธฐ๋ณธํƒ€์ž…๋“ค๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ๋Œ€์‘๋˜๋Š” as_... ๋ฉ”์„œ๋“œ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ด๊ฑด Option์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๊ฐ€๋ น as_i64๋Š” ํ•ด๋‹น Value๊ฐ€ ์ˆซ์ž์ผ ๊ฒฝ์šฐ์—” Some(๊ฐ’)์„, ์•„๋‹ˆ๋ฉด None์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ €๋Œ€๋กœ ๋Œ๋ฆฌ๋ฉด ์ž˜ ๋Œ ๊ฒƒ์ด๋‹ค.

์ „์ฒด ์†Œ์Šค๋Š” ์ด๋ ‡๋‹ค.

fn main() 
{
    //json ๋ฌธ์ž์—ด
    let json = r#"
    {
        "name":"ํ™๊ธธ๋™",
        "age":300,
        "hobby":["์˜ํ™”๊ฐ์ƒ", "๋“ฑ์‚ฐ", "ํ•ด์ ์งˆ"] 
    }
    "#;

    use serde_json::Value;

    //๋ฌธ์ž์—ด์„ ํŒŒ์‹ฑํ•ด json ๊ฐ์ฒด Value๋ฅผ ์ƒ์„ฑ
    let result:Value = serde_json::from_str(json)
        .expect("ํŒŒ์‹ฑ ์‹คํŒจ");

<br>

    let name:Value = result["name"].clone();
    println!("name:{}", name);

    let age:i64 = result["age"].as_i64()
        .expect("์‹คํŒจ");
    println!("age:{}", age);

    println!("hobby:{}", result["hobby"]);
}


๊ฐ์ฒด->๋ฌธ์ž์—ด

์ด๋ฒˆ์—” json ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ทธ๊ฑธ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ”๋ณด์ž.
json ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ์†์‰ฌ์šด ๋ฐฉ๋ฒ•์€ json! ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด ๋งคํฌ๋กœ ํ•จ์ˆ˜๋Š” json ๋ฌธ๋ฒ•์„ ๊ทธ๋ž˜๋„ ์จ๋„ฃ์–ด์„œ Value ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ง์ด๋‹ค.

๊ธฐ์กด Value ๊ฐ์ฒด์— ์ƒˆ ์š”์†Œ๋ฅผ ์ง‘์–ด๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ทธ๋ƒฅ ์ธ๋ฑ์‹ฑ์„ ์‹œ๋„ํ•˜๋ฉด์„œ ์ƒˆ Value ๊ฐ’์„ ๋ผ์›Œ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.



๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•œ ์ง๋ ฌ/์—ญ์ง๋ ฌํ™”

๊ทผ๋ฐ serde์—์„œ๋Š” ์ €๋Ÿฌํ•œ json์— ์ข…์†์ ์ด๊ณ  ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ์—†์ด. ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•ด์„œ ๊ทธ๊ฑธ ํ†ตํ•ด ๊ณง์žฅ json ๊ฐ์ฒด๋ฅผ ํŒŒ์‹ฑํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ ค๋ฉด serde๋ฅผ ์˜์กด์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค. derive๋ฅผ ๊ธฐ๋Šฅ์œผ๋กœ ๋„ฃ์–ด์ฃผ๊ณ .

๊ทธ๋Ÿผ ์ด์ œ ํ•ด๋ณด์ž

์‚ฌ์šฉํ•  json์˜ ํ˜•์‹๋Œ€๋กœ ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Deserialize์™€ Serialize๋ฅผ derive๋กœ ํŒŒ์ƒ์‹œํ‚จ๋‹ค.

๊ทธ๋Ÿผ ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ๊ฐ ๋ณ€ํ™˜์ด ์ž์œ ์ž์žฌ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.


์ถœ๋ ฅ์šฉ ๋ฉ”์„œ๋“œ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •์˜ํ–ˆ๋‹ค.

๊ทธ๋Ÿผ ๋ฌธ์ž์—ด->๊ฐ์ฒด๋กœ์˜ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ด๋ณด์ž
์ด๋ ‡๊ฒŒ json ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด

ํŒŒ์‹ฑ์„ ์‹œ๋„ํ•  ๋•Œ Value ํƒ€์ž…์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํ•ด๋‹น ๊ตฌ์กฐ์ฒด๋กœ ๋ฐ›์„ ์ˆ˜๊ฐ€ ์žˆ๋‹ค!
ํ•ด๋‹น json ๋ฐ์ดํ„ฐ๊ฐ€ ๊ตฌ์กฐ์ฒด์— ์™„์ „ํžˆ ๋“ค์–ด๋งž๋Š”๋‹ค๋Š” ๊ฐ€์ • ํ•˜์—์„œ ๋ง์ด๋‹ค.


๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ json ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ„๋‹จํ•˜๋‹ค. ๊ทธ๋ƒฅ serde_json::to_string ๋ฉ”์„œ๋“œ์— ์ฐธ์กฐ๋กœ ์ „๋‹ฌํ•ด์ฃผ๋ฉด Result๋กœ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

๊ทธ๋ ‡๋‹ค.


์ฐธ์กฐ
https://docs.serde.rs/serde_json/enum.Value.html