Pular para o conteúdo principal

JSON e Serialização

JSON é o formato de troca de dados mais comum. Veja como diferentes linguagens lidam com análise e serialização de JSON.

Analisando e Serializando JSON​

// Parse JSON string to object
const data = JSON.parse('{"name":"John","age":30}');
console.log(data.name); // "John"

// Serialize object to JSON string
const json = JSON.stringify({ name: "John", age: 30 });
// '{"name":"John","age":30}'

// Pretty print
const pretty = JSON.stringify(data, null, 2);

// Custom serialization (replacer)
const json2 = JSON.stringify(data, (key, value) => {
if (key === "age") return undefined; // Exclude
return value;
});

// Parse with reviver
const data2 = JSON.parse(json, (key, value) => {
if (key === "date") return new Date(value);
return value;
});

// Fetch JSON from API
const response = await fetch('/api/data');
const apiData = await response.json();

Principais Conclusões​

  • Suporte nativo vs biblioteca — JavaScript (JSON.parse/JSON.stringify), Python (módulo json), PHP (json_decode/json_encode) e Ruby (JSON.parse/to_json) incluem JSON na biblioteca padrão. Rust usa os crates serde + serde_json; Go usa encoding/json; C e C++ exigem bibliotecas externas como cJSON ou nlohmann/json. Para APIs web e análise de configuração, suporte nativo é conveniente; para trabalho embarcado ou de sistemas, considere a dependência e o tamanho do build das bibliotecas JSON.

  • Desserialização tipada — O serde do Rust mapeia JSON para structs com #[derive(Deserialize)]; Go usa tags de struct: type Person struct { Name string \json:"name"` }; o Codabledo Swift e oSystem.Text.Jsondo C# fazem o mesmo. Quando precisar trabalhar com estrutura desconhecida, use tipos dinâmicos:serde_json::Value, map[string]interface, JsonNodeouJsonDocument`. Prefira desserialização tipada para APIs internas e configurações; use análise dinâmica quando o schema for flexível ou controlado externamente.

  • Padrões Derive/Codable — O #[derive(Serialize, Deserialize)] do Rust, o Codable do Swift e os tipos record do C# habilitam serialização automática com mínimo código repetitivo. Você define a struct e obtém JSON ida e volta de graça; serialização customizada usa implementações Serialize/Deserialize ou atributos como #[serde(rename = "first_name")]. Isso reduz código repetitivo e mantém schema e código em sincronia. Para novos projetos, prefira linguagens com forte suporte a derive/Codable; evite marshalling manual a menos que precise de lógica customizada.

  • Serialização customizada e casos extremos — O JSONEncoder do Python e o replacer/reviver do JavaScript permitem tratamento customizado de datas, BigInt ou outros tipos não-JSON. O encoding/json do Go requer MarshalJSON/UnmarshalJSON customizados para tipos não-padrão. O serde do Rust suporta #[serde(serialize_with = "...")] para lógica customizada. Ao lidar com datas, decimais ou tipos especiais, verifique as opções de customização da biblioteca; JavaScript e Python oferecem hooks flexíveis, enquanto Go e Rust exigem implementações mais explícitas.