diff --git a/Cargo.toml b/Cargo.toml index dd5d31da..8c9563e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,7 @@ module = ["mlua_derive", "ffi/module"] async = ["futures-util"] send = [] serialize = ["serde", "erased-serde", "serde-value"] +json = ["serialize", "serde_json"] macros = ["mlua_derive/macros"] unstable = [] @@ -51,6 +52,7 @@ num-traits = { version = "0.2.14" } rustc-hash = "1.0" futures-util = { version = "0.3", optional = true, default-features = false, features = ["std"] } serde = { version = "1.0", optional = true } +serde_json = { version = "1.0", optional = true } erased-serde = { version = "0.3", optional = true } serde-value = { version = "0.7", optional = true } parking_lot = { version = "0.12", optional = true } diff --git a/src/value.rs b/src/value.rs index 2caa98ea..55c2c13f 100644 --- a/src/value.rs +++ b/src/value.rs @@ -628,6 +628,18 @@ pub trait FromLuaMulti<'lua>: Sized { } } +#[cfg(feature = "json")] +impl<'lua> FromLua<'lua> for serde_json::Value { + fn from_lua(value: Value<'lua>, _: &'lua Lua) -> Result { + let ty = value.type_name(); + serde_json::to_value(value).map_err(|e| Error::FromLuaConversionError { + from: ty, + to: "serde_json::Value", + message: Some(format!("{}", e)), + }) + } +} + #[cfg(test)] mod assertions { use super::*;