diff --git a/src/deserialize.rs b/src/deserialize.rs index a509442..bcb9c31 100644 --- a/src/deserialize.rs +++ b/src/deserialize.rs @@ -26,7 +26,12 @@ pub fn from_str<'input, 'facet, T: Facet<'facet>>( where 'input: 'facet, { - from_slice(input.as_bytes()) + let input_bytes = input.as_bytes(); + + if input_bytes.starts_with(&[0xef, 0xbb, 0xbf]) { + return from_slice(&input_bytes[3..]); + } + from_slice(input_bytes) } impl Format for crate::Json { diff --git a/tests/bom.rs b/tests/bom.rs new file mode 100644 index 0000000..a0e2192 --- /dev/null +++ b/tests/bom.rs @@ -0,0 +1,22 @@ +use facet::Facet; +use facet_json::from_str; +use facet_testhelpers::test; + +#[test] +fn test_basic_with_bom() { + #[derive(Debug, Facet)] + struct HelloBom { + hello: &'static str, + } + let json = "\u{feff}{\"hello\": \"hi!\"}"; + + let result = from_str::(json); + match result { + Ok(data) => { + assert_eq!(data.hello, "hi!"); + } + Err(e) => { + panic!("Failed to parse JSON: {e}"); + } + } +}