자바스크립트 객체 표기법(JSON)은 직관성, 이해성, 다양한 프로그래밍 언어 간의 유비쿼터스 지원으로 인해 소프트웨어 개발 영역에서 널리 활용되고 있습니다. 확장 마크업 언어(XML)의 대안으로, JSON은 서버와 웹 기반 애플리케이션 간 또는 서로 다른 소프트웨어 시스템 구성 요소 간에 정보를 전송하는 가벼운 수단으로 사용됩니다.
직렬화 및 역직렬화는 JSON(JavaScript 객체 표기법) 데이터 작업의 중요한 측면으로, 프로그래밍 애플리케이션 내에서 손쉽게 조작할 수 있는 구조화된 형식으로 JSON 데이터를 변환할 수 있게 해줍니다. 대체 언어로 JSON으로 작업할 때는 언어의 고유한 데이터 구조를 활용하여 JSON 데이터를 직렬화 및 역직렬화해야 하는 경우가 종종 있습니다.
Serde 시작하기
직렬화 및 역직렬화는 컴퓨터 프로그래밍 영역에서, 특히 Rust 프로그래밍 언어의 맥락에서 기본적인 프로세스입니다. Serde 라이브러리는 복잡한 데이터 구조를 저장, 통신 및 기타 목적에 적합한 다양한 형식으로 변환할 수 있도록 하여 Rust로 작업하는 개발자에게 없어서는 안 될 도구 세트 역할을 합니다.
Serde는 Rust의 데이터 유형과 JSON, YAML, BSON, CBOR, MessagePack 등 다양한 데이터 교환 형식 간의 손쉬운 변환을 지원합니다.
Serde의 주요 목표는 직렬화 및 역직렬화 프로세스를 단순화하여 효율성과 안정성을 보장하는 동시에 강력한 타이핑 및 안전 메커니즘을 보존하는 것입니다.
Cargo를 통해 Serde를 타사 라이브러리로 설치 및 활용하려면 Cargo.toml 파일의 의존성 섹션에 다음 지시문을 추가하세요.
[dependencies]
serde = { version = "1.0.159" , features = ["derive"] }
serde_json = "1.0.96"
JSON 데이터와 상호 운용하려면 serde 및 serde\_json 크레이트가 모두 필요합니다. 전자는 기본적인 기능을 제공하며, 후자는 JSON 처리를 위해 특별히 맞춤화된 Serde의 특수한 구현 역할을 합니다.
serde\_json 라이브러리가 제공하는 기능을 도입하는 과정과 serde 패키지의 일부인 Serialize 및 Deserialize 모듈에 포함된 작업은 다음과 같은 방식으로 실행될 수 있다고 추론할 수 있습니다:
use serde::{Serialize, Deserialize};
use serde_json;
Serde는 Rust에서 JSON 데이터로 자주 작업하는 개발자에게 필수적인 도구로, 포괄적인 개발 솔루션의 필수 요소인 뛰어난 기능과 다용도성을 제공합니다.
Serde를 사용한 데이터 직렬화
Rust 구조체를 직렬화하려면 추가 처리를 위해 JSON 형식으로 변환하는 작업이 포함됩니다.이 절차를 세밀하게 제어하기 위해 Serde는 데이터 모델에 대한 직렬화 코드를 생성하고 Rust 구조를 JSON으로 변환할 수 있는 #[derive(Serialize)] 속성을 포함하여 Rust 구조와 함께 사용할 수 있는 다양한 속성을 제시합니다.
개인 정보를 포괄하는 구조의 예와 그 위에 Serializable 속성을 통합하고 활용하는 과정을 소개해 드리겠습니다:
use serde::{Serialize, Deserialize};
use serde_json;
#[derive(Serialize)]
struct Person {
name: String,
age: u32,
}
`Person` 구조체에 ‘[#derive(Serialize)]` 어노테이션을 사용하는 동안, 구조체를 직렬화하기 위해 필요한 코드를 자동으로 생성하도록 Serde 라이브러리에 지시하고 있습니다.
Person 구조체의 객체를 JSON 형식으로 변환하려면 다음 단계를 따를 수 있습니다:
use serde::{Serialize};
use serde_json;
fn main() {
// declaration of the Person struct instance with the name and age fields
let person = Person {
name: "Chukwuemeriwo".to_string(),
age: 28,
};
// serializes the person struct to JSON using the serde_json library
let json = serde_json::to_string(&person).expect("Serialization failed");
// prints the serialized JSON string
println!("Serialized JSON: {}", json);
}
이 코드의 주요 기능은 `serde_json` 라이브러리를 사용하여 `Person` 구조체를 JSON 표현으로 변환하는 것입니다. 특히 라이브러리에서 제공하는 `to_string()` 메서드를 활용하는데, 이 메서드는 `Person` 인스턴스에 대한 참조를 받아 직렬화된 형식에서 JSON 문자열을 생성합니다.
가장 중요한 함수의 주요 목적은 직렬화된 JSON 출력을 콘솔에 출력하는 것입니다.
serde 및 serde\_json 모듈은 다른 데이터 구조 외에도 배열을 직렬화할 수 있는 고도의 적응성을 가지고 있습니다.
use serde::{Serialize, Deserialize};
use serde_json;
#[derive(Serialize)]
struct Coordinates {
x: f32,
y: f32,
}
fn main() {
let points = vec![
Coordinates { x: 1.0, y: 2.0 },
Coordinates { x: 3.5, y: 4.5 },
];
let json = serde_json::to_string(&points).expect("Serialization failed");
println!("Serialized JSON: {}", json); // Print the serialized JSON string
}
“points” 변수는 2차원 공간 내의 지리적 위치를 나타내는 “Coordinates” 구조체의 인스턴스 모음입니다. “Coordinates” 구조체에 적용된 “Serialize” 속성을 활용하면 최소한의 노력으로 벡터를 JSON 형식으로 직렬화할 수 있습니다.
구조체 및 벡터 유형이 처리되는 방식과 유사한 방식으로 serde를 사용하여 열거형을 JSON으로 변환할 수 있을 뿐만 아니라, 그렇게 할 수 있는 옵션도 있습니다.
use serde::{Serialize, Deserialize};
use serde_json;
#[derive(Serialize, Deserialize)]
enum Animal {
Dog(String),
Cat(u32),
Bird,
}
fn main() {
let dog = Animal::Dog("Rusty".to_string());
let json = serde_json::to_string(&dog).expect("Serialization failed");
println!("Serialized JSON: {}", json);
}
사용되는 특정 변형에 따라 직렬화 절차는 요구 사항에 맞게 조정됩니다(예를 들어, 이 특정 시나리오에서 Animal::Dog 변형은 Serde가 직렬화 중에 JSON 문자열로 변환하는 String 필드로 구성됨).
Serde를 사용한 데이터 역직렬화
직렬화를 통해 JSON 데이터를 프로그래밍 언어의 고유한 데이터 유형으로 변환하는 행위를 JSON 역직렬화라고 합니다. Serde 라이브러리는 이 작업을 위한 광범위한 플랫폼을 제공하며, 다양한 내장 데이터 유형과 호환됩니다.
Serde는 역직렬화를 위해 Rust 구조에 주석을 다는 데 사용할 수 있는 속성 집합을 제공합니다.직렬화를 위해 가장 자주 사용되는 어트리뷰트 중에는 #[derive(역직렬화)] 및 #[serde(rename = “json\_field\_name)] 어트리뷰트가 있습니다.
`#[derive(Deserialize)]` 속성을 사용하면 Rust 구조체에 대한 역직렬화 구현을 쉽게 생성할 수 있으며, `#[serde(rename = “json_field_name)]` 속성을 사용하면 구조체 필드를 해당 JSON 필드 이름과 연결할 수 있습니다.
Serde 라이브러리를 사용하여 JSON 데이터를 특정 구조체 유형으로 변환하는 한 가지 방법은 `serde_json::from_str` 함수를 활용하는 것입니다. 이 함수는 JSON 데이터의 문자열 표현을 받아 지정된 구조체 타입의 값으로 변환합니다. 이를 수행하려면 먼저 필요한 Serde 모듈을 가져옵니다:
use serde::Deserialize;
use serde_json;
// defines a struct for Person with the Deserialize trait from Serde
#[derive(Deserialize)]
struct Person {
#[serde(rename = "name")] // renames the field to "name"
full_name: String,
age: u32,
}
fn main() {
let json_data = r#"
{
"name": "John Doe",
"age": 30
}
"#;
// deserializes the JSON data into a Person struct
let person: Person = serde_json::from_str(json_data).unwrap();
// Print the full name and age of the person
println!("Name: {}", person.full_name);
println!("Age: {}", person.age);
}
Person 구조체에 `#[derive(역직렬화)]` 속성을 구현함으로써, Serde가 JSON 소스에서 해당 구조체를 역직렬화할 수 있음을 전달합니다. 또한, `#[serde(rename = “name”)]` 속성을 통합함으로써, JSON 내의 ‘name’ 필드는 C++ 표현 내에서 보다 포괄적인 ‘full\_name’에 매핑됩니다.
“from\_str” 함수의 목적은 “json\_data” 변수에 저장된 직렬화된 JSON 데이터를 “person” 클래스의 인스턴스로 변환하고 각 필드에 해당 값을 할당하는 것입니다. 그 후 기본 함수는 생성된 ‘사람’ 객체의 모든 속성을 콘솔에 인쇄하여 표시합니다.
Serde는 기본 유형, 열거형, 중첩 구조체 및 컬렉션을 비롯한 다양한 Rust 데이터 유형에 대해 역직렬화를 수행할 수 있습니다.
JSON 배열을 벡터 필드를 포함하는 Rust 구조체로 변환하려면 다음 단계를 따를 수 있습니다:
use serde::Deserialize;
#[derive(Deserialize)]
struct Data {
numbers: Vec<u32>,
}
fn main() {
let json_data = r#"
{
"numbers": [1, 2, 3, 4, 5]
}
"#;
let data: Data = serde_json::from_str(json_data).unwrap();
for number in data.numbers {
println!("Number: {}", number);
}
}
for 루프는 데이터 벡터 내의 각 요소를 반복하며, 이 데이터 벡터는 이전에 주요 기능을 사용하여 json\_data JSON 문자열에서 역직렬화되었습니다.
잠재적인 문제나 부정확성을 방지하기 위해 직렬화 프로세스 중에 적절한 데이터 유형과 식별자가 사용되는지 확인합니다.
Serde는 널리 사용되는 Rust 웹 프레임워크와 상호 운용
직렬화는 데이터 개체 또는 구조를 한 형식에서 다른 형식으로 변환하는 프로세스를 말하며, 역직렬화는 원래 형식으로 다시 변환하는 것을 포함합니다. Serde는 다양한 형식의 데이터 송수신 절차를 간소화하는 사용자 친화적인 인터페이스와 함께 이러한 측면에서 수많은 기능을 자랑하는 효율적인 라이브러리입니다.
Serde는 Rust 커뮤니티 내에서 널리 채택되어 수많은 유명 패키지와 프레임워크가 설계의 필수적인 부분으로 이 기능을 통합하고 있습니다.여기에는 Actix, Warp, Rocket과 같은 영향력 있는 웹 프레임워크뿐만 아니라 Serde의 기능을 수용한 Diesel과 같은 데이터베이스 객체 관계형 매퍼(ORM)도 포함됩니다.