Find out about keys that are ignored when deserializing data
Rust
106
155 commits
updated Jun 24, 2026
Find out about keys that are ignored when deserializing data. This crate
provides a wrapper that works with any existing Serde Deserializer and invokes
a callback on every ignored field.
You can use this to warn users about extraneous keys in a config file, for example.
Note that if you want unrecognized fields to be an error, consider using the
#[serde(deny_unknown_fields)] attribute instead.
[dependencies]
serde = "1.0"
serde_ignored = "0.1"
use serde::Deserialize;
use std::collections::{BTreeSet as Set, BTreeMap as Map};
#[derive(Debug, PartialEq, Deserialize)]
struct Package {
name: String,
dependencies: Map<String, Dependency>,
}
#[derive(Debug, PartialEq, Deserialize)]
struct Dependency {
version: String,
}
fn main() {
let j = r#"{
"name": "demo",
"dependencies": {
"serde": {
"version": "1.0",
"typo1": ""
}
},
"typo2": {
"inner": ""
},
"typo3": {}
}"#;
// Some Deserializer.
let jd = &mut serde_json::Deserializer::from_str(j);
// We will build a set of paths to the unused elements.
let mut unused = Set::new();
let p: Package = serde_ignored::deserialize(jd, |path| {
unused.insert(path.to_string());
}).unwrap();
// Deserialized as normal.
println!("{:?}", p);
// There were three ignored keys.
let mut expected = Set::new();
expected.insert("dependencies.serde.typo1".to_owned());
expected.insert("typo2".to_owned());
expected.insert("typo3".to_owned());
assert_eq!(unused, expected);
}
916 followers · starred Jun 2026
1,058 followers · starred May 2025
288 followers · starred Aug 2019
160 followers · starred Aug 2025
Find out about keys that are ignored when deserializing data
Rust
106
155 commits
updated Jun 24, 2026
Find out about keys that are ignored when deserializing data. This crate
provides a wrapper that works with any existing Serde Deserializer and invokes
a callback on every ignored field.
You can use this to warn users about extraneous keys in a config file, for example.
Note that if you want unrecognized fields to be an error, consider using the
#[serde(deny_unknown_fields)] attribute instead.
[dependencies]
serde = "1.0"
serde_ignored = "0.1"
use serde::Deserialize;
use std::collections::{BTreeSet as Set, BTreeMap as Map};
#[derive(Debug, PartialEq, Deserialize)]
struct Package {
name: String,
dependencies: Map<String, Dependency>,
}
#[derive(Debug, PartialEq, Deserialize)]
struct Dependency {
version: String,
}
fn main() {
let j = r#"{
"name": "demo",
"dependencies": {
"serde": {
"version": "1.0",
"typo1": ""
}
},
"typo2": {
"inner": ""
},
"typo3": {}
}"#;
// Some Deserializer.
let jd = &mut serde_json::Deserializer::from_str(j);
// We will build a set of paths to the unused elements.
let mut unused = Set::new();
let p: Package = serde_ignored::deserialize(jd, |path| {
unused.insert(path.to_string());
}).unwrap();
// Deserialized as normal.
println!("{:?}", p);
// There were three ignored keys.
let mut expected = Set::new();
expected.insert("dependencies.serde.typo1".to_owned());
expected.insert("typo2".to_owned());
expected.insert("typo3".to_owned());
assert_eq!(unused, expected);
}
916 followers · starred Jun 2026
1,058 followers · starred May 2025
288 followers · starred Aug 2019
160 followers · starred Aug 2025