From 9253a5ab482d2b476356b2b44141ea8b3ec69eb0 Mon Sep 17 00:00:00 2001 From: vaagai Date: Tue, 26 Aug 2025 15:42:12 +0530 Subject: [PATCH 1/2] fix:ignore BOM if present --- src/deserialize.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 { From 543f5146dc1e47a2fb9d695dfdabc18665dff897 Mon Sep 17 00:00:00 2001 From: vaagai Date: Tue, 26 Aug 2025 19:59:56 +0530 Subject: [PATCH 2/2] add simple test to ignore BOM --- tests/bom.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/bom.rs 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}"); + } + } +}