A maioria dos exemplos que mostram a desserialização de JSON com Rust serde_json
mostram a desserialização em um formato de estrutura conhecido, usando um struct
.
É possível desserializar um documento JSON com uma estrutura desconhecida em um tipo de dado Rust genérico que pode lidar com essa variação estrutural?
Por exemplo, eu tentei algo assim
let filename = "example.json";
let maybe_ifile = std::fs::File::open(filename);
match maybe_ifile {
Ok(ifile) => {
let maybe_json_data = serde_json::from_reader::<_, BTreeMap<String, String>>(ifile);
match maybe_json_data {
Ok(json_data) => {
println!("{json_data:?}");
}
Err(error) => {
panic!("{error}")
}
}
}
Err(error) => {
panic!("{error}");
}
}
Isso funciona se o documento JSON for estruturado como pares de strings de chave-valor, mas não funciona para estruturas mais gerais, então claramente usar BTreeMap<String, String>
não é a abordagem correta aqui.
O que estou tentando alcançar é flexibilidade usando tipos de tempo de execução/um tanto dinâmicos.
Isso é possível em outras linguagens, então presumo que haja uma solução bastante trivial em Rust, só não sei qual é.
A solução foi usar o
serde_json::Value
datatype. Isso fornece uma maneira genérica de trabalhar com dados JSON.A linha única mudou:
Exemplo de desserialização de documento JSON genérico
Aqui está um exemplo de desserialização de uma string JSON em
serde_json::Value
:Explicação
Analisando JSON: A função serde_json::from_str analisa a string JSON em um serde_json::Value.
Acessando Dados: Use o
get
método para acessar campos no JSON. Você pode usar métodos específicos de tipo comoas_str
,as_i64
, eas_bool
para converter os valores JSON para tipos Rust.Manipulando JSON aninhado e complexo
A
serde_json::Value
enumeração pode representar dados JSON de qualquer estrutura:Value::Object
para objetos JSONValue::Array
para matrizesValue::String
para cordasValue::Number
para númerosValue::Bool
para booleanosValue::Null
para nulosIsso o torna adequado para desserialização JSON genérica quando a estrutura não é fixa.