When using serde feature to serialize a table keys are coerced to string and data is missing from serialization.
cargo.toml
[package]
name = "mlua_serde_bug"
version = "0.2.0"
edition = "2024"
[dependencies]
mlua = { version = "0.11.1", features = ["luau", "send", "serde"] }
serde = { version = "1.0.219", features = ["serde_derive"]}
serde_json = "1.0.143"
anyhow = { version = "1.0", optional = true }
main.rs
use mlua::{Lua, LuaSerdeExt, Result, Table, Value};
use serde::Deserialize;
fn main() -> Result<()> {
let lua = Lua::new();
let value: Value = lua.load(r#"{["1"]="text one",[1]="number one"}"#).eval()?;
let table: &Table = value.as_table().unwrap();
let n1 = table.raw_get::<String>(1).unwrap();
println!("n1 {}", n1);
let t1 = table.raw_get::<String>("1").unwrap();
println!("t1 {}", t1);
assert!(n1 == "number one".to_owned());
assert!(t1 == "text one".to_owned());
let serialized = serde_json::to_string(&value).unwrap();
let deserialized: serde_json::Value = serde_json::from_str(&serialized).unwrap();
let value: Value = lua.to_value(&deserialized).unwrap();
let table: Table = value.as_table().unwrap().clone();
let n1 = table.raw_get::<String>(1).unwrap();
println!("n1 {}", n1);
let t1 = table.raw_get::<String>("1").unwrap();
println!("t1 {}", t1);
assert!(n1 == "number one".to_owned());
assert!(t1 == "text one".to_owned());
Ok(())
}
When using serde feature to serialize a table keys are coerced to string and data is missing from serialization.
cargo.toml
main.rs