본문으로 건너뛰기

JSON Rust 구조체 변환

JSON to Rust Structs

JSON 예시로 serde 속성이 붙은 Rust 구조체를 만듭니다. 비거나 빠진 필드는 Option으로, 키 이름은 snake_case와 rename으로 처리합니다.

예시 JSON 문서에서 `serde` derive가 붙은 Rust 구조체를 냅니다. `Serialize`와 `Deserialize`, 가끔 빠지던 필드에 붙는 `Option<…>`, 그리고 JSON 키가 snake_case 필드 이름으로 쓸 수 없을 때의 `#[serde(rename = "…")]`까지 함께 나옵니다.

🔒 브라우저 안에서만 처리rustjsoncodegenserde
출력 언어

예시 JSON

.json 파일 놓기

이 탭에서 읽습니다. 올라가지 않습니다.

가진 원소를 전부 넣으세요. 레코드가 하나 늘 때마다 추측이 좁아집니다. 어느 하나에 없는 필드가 선택 필드가 되는 근거입니다.

Rust

사용 방법

  1. 가진 레코드를 되도록 많이 붙여넣습니다

    배열은 첫 원소만이 아니라 모든 원소를 읽어서 합칩니다. 레코드가 셋이면 하나일 때보다 훨씬 많은 것을 알려 줍니다. 어느 하나에 없는 필드가 바로 그 필드를 선택으로 만드는 근거이기 때문입니다.

  2. 루트 타입 이름을 정합니다

    중첩된 객체는 그것을 담은 키 이름을 따르고, 배열이면 단수형으로 바뀝니다. `users`는 `User`가 됩니다. 이름을 직접 정해야 하는 건 루트뿐입니다.

  3. 출력 아래의 숫자를 확인합니다

    타입 수, 선택 필드 수, 유니온 수, 합친 레코드 수가 나옵니다. 유니온이 0보다 크면 어떤 필드가 표본 안에서 서로 다른 종류의 값을 가졌다는 뜻이니, 결과를 코드베이스에 붙여넣기 전에 한 번 볼 만합니다.

  4. 구조체를 크레이트에 붙여넣습니다

    `use serde::{Deserialize, Serialize};` 줄은 함께 나옵니다. 크레이트와 `derive` 기능은 Cargo.toml에 직접 추가해야 합니다.

자주 묻는 질문

왜 어떤 필드가 `serde_json::Value`로 나왔나요?

표본 안에서 값의 종류가 하나가 아니었기 때문입니다. 어떤 레코드에서는 문자열, 다른 레코드에서는 숫자였다는 뜻입니다. 여기서 기댈 만한 태그 없는 유니온이 Rust에는 없고, `Value`가 솔직한 타입입니다. 안에 무엇이 들었는지 속이지 않고 역직렬화합니다.

`Option<T>`와 `#[serde(default)]`는 뭐가 다른가요?

일부 레코드에서 `null`이던 필드는 `Option<T>`가 되고, 아예 키가 없던 필드에는 `#[serde(default)]`까지 붙어서 그 키 없는 레코드도 오류 없이 역직렬화됩니다. 표본에 둘 다 나타났다면 둘 다 붙습니다.

문자열 필드에 enum이 만들어지나요?

아니요. 문자열은 전부 `String`입니다. 몇 개의 레코드에서 enum을 추론하면, 표본에 없던 변형이 처음 들어오는 순간 역직렬화가 실패합니다. 느슨한 타입보다 나쁜 실패입니다.

다른 trait도 derive할 수 있나요?

직접 추가하세요. 나오는 derive 목록은 일부러 `Serialize, Deserialize`뿐입니다. `Debug`와 `Clone`은 대개 함께 쓰지만 한 줄만 고치면 되고, 잘못 짐작하면 그 trait을 derive할 수 없는 타입에서 컴파일이 깨집니다.

이 도구로 이어지는 것

다음 단계

이 도구의 결과를 그대로 받을 수 있는 도구들입니다.