diff options
| author | Darshan Sen <raisinten@gmail.com> | 2022-10-03 01:48:31 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-02 22:18:31 +0200 |
| commit | bac3a1210f9c773112f3d5001305d1cc6a097798 (patch) | |
| tree | 5b80211a315fba2392d0a9d8bb4811f868333358 /serde_v8 | |
| parent | e07b62d74a451a0ba6617f1bc7875d9c71c85ee2 (diff) | |
fix(serde_v8): serialize objects with numeric keys correctly (#15946)
Signed-off-by: Darshan Sen <raisinten@gmail.com>
Diffstat (limited to 'serde_v8')
| -rw-r--r-- | serde_v8/de.rs | 8 | ||||
| -rw-r--r-- | serde_v8/tests/de.rs | 23 |
2 files changed, 29 insertions, 2 deletions
diff --git a/serde_v8/de.rs b/serde_v8/de.rs index 79fb9ae6d..dff29b8f9 100644 --- a/serde_v8/de.rs +++ b/serde_v8/de.rs @@ -325,8 +325,12 @@ impl<'de, 'a, 'b, 's, 'x> de::Deserializer<'de> }; visitor.visit_map(map) } else { - let prop_names = - obj.get_own_property_names(self.scope, Default::default()); + let prop_names = obj.get_own_property_names( + self.scope, + v8::GetPropertyNamesArgsBuilder::new() + .key_conversion(v8::KeyConversionMode::ConvertToString) + .build(), + ); let keys: Vec<magic::Value> = match prop_names { Some(names) => from_v8(self.scope, names.into()).unwrap(), None => vec![], diff --git a/serde_v8/tests/de.rs b/serde_v8/tests/de.rs index 7affe5f8e..c67b4012c 100644 --- a/serde_v8/tests/de.rs +++ b/serde_v8/tests/de.rs @@ -185,6 +185,29 @@ fn de_map() { } #[test] +fn de_obj_with_numeric_keys() { + dedo( + r#"({ + lines: { + 100: { + unit: "m" + }, + 200: { + unit: "cm" + } + } +})"#, + |scope, v| { + let json: serde_json::Value = serde_v8::from_v8(scope, v).unwrap(); + assert_eq!( + json.to_string(), + r#"{"lines":{"100":{"unit":"m"},"200":{"unit":"cm"}}}"# + ); + }, + ) +} + +#[test] fn de_string_or_buffer() { dedo("'hello'", |scope, v| { let sob: serde_v8::StringOrBuffer = serde_v8::from_v8(scope, v).unwrap(); |
