From 5e7070f563bd4a81f242d51b648f2c677898b75d Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Wed, 16 Apr 2025 14:50:50 +0200 Subject: [PATCH] Handle serde_json arbitrary_precision --- jmespath/src/variable.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/jmespath/src/variable.rs b/jmespath/src/variable.rs index 8df87487..56962808 100644 --- a/jmespath/src/variable.rs +++ b/jmespath/src/variable.rs @@ -1260,6 +1260,21 @@ impl ser::SerializeMap for MapState { } fn end(self) -> Result { + // When serde_json has arbitrary_precision feature enabled, it represents numbers as an object + // with a single key "$serde_json::private::Number" and a string value. + // This is a workaround to convert it back to a number. + let bignum_serde_key = "$serde_json::private::Number"; + if self.map.len() == 1 { + match self.map.get(bignum_serde_key) { + Some(ref value) => { + match value.as_ref() { + Variable::String(s) => {return Ok(Variable::Number(s.parse()?));} + _ => unreachable!("{} should be a string", bignum_serde_key) + } + } + None => () + } + } Ok(Variable::Object(self.map)) } }