Code Monkey home page Code Monkey logo

Comments (4)

cppcoffee avatar cppcoffee commented on July 18, 2024

This usage is to register the json_decode function on the Lua side, so it can be used similarly to the c-json library:

local value = app.json_decode('{"id":123, "name":"foo"}')
print(value.name)

from mlua.

cppcoffee avatar cppcoffee commented on July 18, 2024

Finally, I solved the problem with a layer of intermediate transformations:

fn main() {
    let s = r#"
    {
        "id": 123,
        "name": "foo"
    }
    "#;

    let lua = mlua::Lua::new();
    let tmp: serde_json::Value = serde_json::from_str(&s).unwrap();
    let value = json_to_lua_value(&lua, tmp).unwrap();

    println!("{:?}", value);
}

fn json_to_lua_value(lua: &mlua::Lua, json_value: serde_json::Value) -> mlua::Result<mlua::Value> {
    match json_value {
        serde_json::Value::Null => Ok(mlua::Value::Nil),
        serde_json::Value::Bool(b) => Ok(mlua::Value::Boolean(b)),
        serde_json::Value::Number(n) => {
            if let Some(i) = n.as_i64() {
                Ok(mlua::Value::Integer(i))
            } else if let Some(f) = n.as_f64() {
                Ok(mlua::Value::Number(f))
            } else {
                Err(mlua::Error::RuntimeError("Invalid JSON number".into()))
            }
        }
        serde_json::Value::String(s) => Ok(mlua::Value::String(lua.create_string(s)?)),
        serde_json::Value::Array(arr) => {
            let table = lua.create_table()?;
            for (i, v) in arr.iter().enumerate() {
                table.set(i + 1, json_to_lua_value(lua, v.clone())?)?;
            }
            Ok(mlua::Value::Table(table))
        }
        serde_json::Value::Object(obj) => {
            let table = lua.create_table()?;
            for (k, v) in obj.iter() {
                table.set(k.as_str(), json_to_lua_value(lua, v.clone())?)?;
            }
            Ok(mlua::Value::Table(table))
        }
    }
}

from mlua.

cppcoffee avatar cppcoffee commented on July 18, 2024

Isn't there a better interface for this usage? That is, it can be converted directly, without the need for a middle layer conversion

from mlua.

khvzak avatar khvzak commented on July 18, 2024

Isn't there a better interface for this usage? That is, it can be converted directly, without the need for a middle layer conversion

Yes, use can use LuaSerdeExt::to_value.

An example: https://github.com/mlua-rs/mlua/blob/master/examples/serialize.rs#L49

from mlua.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.