본문으로 건너뛰기

JSON을 Rust Serde 구조체로 변환 — Numio

JSON 샘플로 serde Serialize와 Deserialize를 derive한 Rust struct를 생성합니다. 필드는 rename_all 속성과 함께 snake_case가 되고, 배열의 일부 항목에만 있는 키는 Option<T>, null 값은 serde_json::Value가 됩니다.

reqwest 클라이언트에서 serde_json으로 역직렬화하기 전에 서드파티 API 응답에 타입을 지정합니다.

JSON

Rust Serde

이럴 때 사용하세요

  • reqwest 클라이언트에서 serde_json으로 역직렬화하기 전에 서드파티 API 응답에 타입을 지정합니다.
  • Rust CLI나 Axum 서비스의 JSON 설정 파일 또는 픽스처 파일용 struct를 작성합니다.

사용 방법

  1. JSON 샘플을 붙여 넣습니다. 선택적 필드가 있다면 그 필드가 있는 배열 항목과 없는 항목을 모두 포함하세요.
  2. 설정을 열고 JSON 키 표기에 맞는 Property Name Format을 고릅니다(기본값 camelCase). 이 값이 #[serde(rename_all = ...)]을 정하고, 맞지 않는 키에는 #[serde(rename = ...)]이 붙습니다.
  3. 코드를 복사하고, 생성된 use 줄에 맞춰 Cargo.toml에 serde(derive 포함), serde_derive, serde_json을 추가합니다.

JSON 입력

{
  "orderId": "A-1001",
  "total": 19.5,
  "paid": true,
  "coupon": null,
  "items": [
    { "sku": "PEN-01", "qty": 2 },
    { "sku": "BOOK-7", "qty": 1, "giftWrap": true }
  ]
}

Rust struct (serde)

use serde_derive::Deserialize;
use serde_derive::Serialize;
use serde_json::Value;

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Root {
    pub order_id: String,
    pub total: f64,
    pub paid: bool,
    pub coupon: Value,
    pub items: Vec<Item>,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Item {
    pub sku: String,
    pub qty: i64,
    pub gift_wrap: Option<bool>,
}

세부 정보 및 제한 사항

생성은 브라우저에서 json_typegen WebAssembly 모듈로 실행되며 서버로 아무것도 보내지 않습니다.

정수는 i64, 소수는 f64가 됩니다. null과 빈 배열은 serde_json::Value와 Vec<Value>가 되므로 Option<String> 같은 구체적인 타입으로 바꾸세요.

Rust 키워드는 이름이 바뀝니다. type이라는 키는 type_field가 되고 #[serde(rename = "type")]이 붙습니다.

모든 struct는 Serialize, Deserialize와 함께 Default, Debug, Clone, PartialEq도 derive합니다. 필요 없는 것은 지우세요.

FAQ

Property Name Format 설정은 무엇을 바꾸나요?

Rust 필드 이름이 아니라 JSON 키의 표기 방식을 지정합니다. 필드는 항상 snake_case이며, 이 설정이 rename_all 값을 정해 serde가 camelCase, kebab-case, PascalCase 등으로 다시 매핑하게 합니다.

선택적 필드는 어떻게 감지하나요?

같은 배열의 객체들이 서로 다른 키를 가지면 일부 항목에만 있는 키가 Option<T>가 됩니다. 모든 샘플 항목에 있는 필드는 API가 가끔 생략하더라도 선택적이 되지 않습니다.

JSON 루트가 배열이어도 되나요?

예. 루트 배열은 pub type Root = Vec<Root2>;와 항목용 struct Root2를 만듭니다.

사양 및 참고 자료