Introducción al trabajo con JSON en Rust
JSON (JavaScript Object Notation) es uno de los formatos de intercambio de datos más populares en el desarrollo web, archivos de configuración y API. Si estás aprendiendo Rust y quieres aprender a trabajar eficientemente con JSON, este artículo es para ti. Revisaremos las bibliotecas principales, los principios de análisis y serialización, y analizaremos ejemplos prácticos de código.
En Rust, el ecosistema para trabajar con JSON se construye alrededor del crate serde, un potente framework para la serialización y deserialización de datos. Junto con serde_json, permite transformar fácilmente estructuras de datos a JSON y viceversa. Vamos a entender cómo funciona.
Instalación y configuración de dependencias
Para empezar, crearemos un nuevo proyecto y añadiremos las dependencias necesarias en el archivo Cargo.toml:
[dependencies]serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"El crate serde proporciona las macros #[derive(Serialize, Deserialize)], que implementan automáticamente los traits necesarios para tus estructuras. serde_json se encarga directamente del trabajo con el formato JSON.
Análisis de JSON: de cadena a estructura
Supongamos que tenemos una cadena JSON con información de un usuario. Queremos transformarla en una estructura tipada de Rust. Así es como se hace:
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)]struct User { name: String, age: u32, email: String, is_active: bool,}
fn main() { let json_data = r#" { "name": "Алексей", "age": 28, "email": "alex@example.com", "is_active": true } "#;
// Análisis de JSON a estructura let user: User = serde_json::from_str(json_data).expect("Error al analizar JSON"); println!("Usuario: {:?}", user); println!("Nombre: {}", user.name); println!("Edad: {}", user.age);}Observa el atributo #[derive(Debug, Deserialize, Serialize)]. Debug permite imprimir la estructura en la consola, mientras que Deserialize y Serialize permiten transformar datos a JSON y viceversa.
Manejo de objetos anidados
JSON a menudo contiene objetos anidados. Veamos un ejemplo con la dirección de un usuario:
#[derive(Debug, Deserialize, Serialize)]struct Address { city: String, street: String, zip_code: String,}
#[derive(Debug, Deserialize, Serialize)]struct User { name: String, age: u32, address: Address,}
fn main() { let json_data = r#" { "name": "Мария", "age": 32, "address": { "city": "Москва", "street": "Тверская, 15", "zip_code": "101000" } } "#;
let user: User = serde_json::from_str(json_data).unwrap(); println!("Ciudad: {}", user.address.city);}Trabajo con arrays JSON
Los arrays en JSON se transforman en Vec u otras colecciones de Rust:
use serde::Deserialize;
#[derive(Debug, Deserialize)]struct Product { id: u32, name: String, price: f64,}
fn main() { let json_array = r#" [ {"id": 1, "name": "Ноутбук", "price": 75000.50}, {"id": 2, "name": "Мышь", "price": 1500.00}, {"id": 3, "name": "Клавиатура", "price": 3500.00} ] "#;
let products: Vec<Product> = serde_json::from_str(json_array).unwrap(); for product in &products { println!("{}: {} руб.", product.name, product.price); }}Serialización: de estructura a JSON
El proceso inverso: transformar una estructura de Rust en una cadena JSON. Esto se llama s