从Lua到C的Lua嵌套表

2024-06-25

我不幸未能将嵌套 Lua 表转换为 C json 对象。我正在使用 LuaTableToJson(请参阅后面的代码),其中“index”是要检索的参数索引,PopOneArg 是根据值的类型处理值的例程。

当有嵌套表时,我想递归地调用 LuaTableToJson,但索引 = -1 时它不起作用。

问题:能否请某人指出工作示例以检索作为参数从 Lua 传递到 C 的嵌套表。或者有人可以解释将嵌套表从 Lua 传递到 C 时的堆栈结构。

谢谢

注意:对于 C->Lua 我有一个解决方案。

    STATIC json_object *LuaTableToJson (lua_State* luaState, int index) {
    int idx;

    json_object *tableJ= json_object_new_object();
    const char *key;
    char number[3];
    lua_pushnil(luaState); // 1st key
    for (idx=1; lua_next(luaState, index) != 0; idx++) {

        // uses 'key' (at index -2) and 'value' (at index -1)
        if (lua_type(luaState,-2) == LUA_TSTRING) key= lua_tostring(luaState, -2);
        else {
            snprintf(number, sizeof(number),"%d", idx);
            key=number;
        } 
        json_object *argJ= PopOneArg(luaState, -1);
        json_object_object_add(tableJ, key, argJ);
        lua_pop(luaState, 1); // removes 'value'; keeps 'key' for next iteration 
    } 

    // Query is empty free empty json object
    if (idx == 1) {
        json_object_put(tableJ);
        return NULL;
    }
    return tableJ;
}

STATIC  json_object *PopOneArg (lua_State* luaState, int idx) {
    json_object *value=NULL;

    int luaType = lua_type(luaState, idx);
    switch(luaType)  {
        case LUA_TNUMBER: {
            lua_Number number= lua_tonumber(luaState, idx);;
            int nombre = (int)number; // evil trick to determine wether n fits in an integer. (stolen from ltcl.c)
            if (number == nombre) {
                value= json_object_new_int((int)number);
            } else {
                value= json_object_new_double(number);
            }
            break;
        }
        case LUA_TBOOLEAN:
            value=  json_object_new_boolean(lua_toboolean(luaState, idx));
            break;
        case LUA_TSTRING:
           value=  json_object_new_string(lua_tostring(luaState, idx));
            break;
        case LUA_TTABLE: {
            if (idx > 0) {
                value= LuaTableToJson(luaState, idx);
            } else {
                value= json_object_new_string("UNSUPPORTED_Lua_Nested_Table");
            }
            break;                
        }    
        case LUA_TNIL:
            value=json_object_new_string("nil") ;
            break;

        default:
            AFB_NOTICE ("PopOneArg: script returned Unknown/Unsupported idx=%d type:%d/%s", idx, luaType, lua_typename(luaState, luaType));
            value=NULL;
    }

    return value;    
}

static json_object *LuaPopArgs (lua_State* luaState, int start) {    
    json_object *responseJ;

    int stop = lua_gettop(luaState);
    if(stop-start <0) return NULL;

    // start at 2 because we are using a function array lib
    if (start == stop) {
        responseJ=PopOneArg (luaState, start);
    } else {
        // loop on remaining return arguments
        responseJ= json_object_new_array();
        for (int idx=start; idx <= stop; idx++) {
            json_object *argJ=PopOneArg (luaState, idx);
            if (!argJ) goto OnErrorExit;
            json_object_array_add(responseJ, argJ);     
       }
    }

    return responseJ;

  OnErrorExit:
    return NULL;
}   

对于打包的解决方案,请检查我的代码here https://github.com/nickcano/XenoScan/blob/master/src/XenoLua/LuaVariant.h#L101-L176

本质上,在解析嵌套表时,您应该在负索引处进行解析。在这种情况下,lua_next会弄乱相对于您正在跟踪的索引的堆栈,因此您需要递减它。

你可以试试

if (index < 0) index--; // change to -- as in your code

解析表时。它应该适用于您的代码,但我不能保证我没有遗漏其他问题。

我的代码肯定适用于任何级别的嵌套,因此我建议将其作为示例,并在其工作后将最终代码作为答案发布。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从Lua到C的Lua嵌套表 的相关文章

  • 您使用什么工具和技术来查找死代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪些工具和技术来查找 NET 中的死代码 过去 我用 Obsolete 属性修饰方法 传递 tr
  • 如何在改造中在主体内传递 JSON 数组

    intent sale redirect urls return url http example com your redirect url html cancel url http example com your cancel url
  • 使用索引避免迭代器失效,维护干净的接口

    我创建了一个MemoryManager
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 外部剃刀视图看不到外部模型

    我对外部剃刀视图有疑问 在我的项目中 我有主 mvc Web 程序集和动态加载的外部类库程序集 来自 DB 及其自己的控制器 视图和模型 这些程序集在运行时不会直接引用和加载 我能够通过为控制器创建自定义控制器工厂 为视图创建自定义虚拟路径
  • 指向指针的指针和指向二维数组的指针之间的区别

    如果我有一个二维数组 B 定义为 int B 2 3 1 3 5 2 4 6 Is int p B与 一样int p 3 B int f B printf d f 1 gives 5作为输出 同时printf d f 给出 1 作为答案 为
  • 用 C# 中的字典中的值替换字符串中的单词

    我有一个简单的dictionary像这样 var fruitDictionary new Dictionary
  • 在 Windows 服务中使用 OleDb 从 Excel 读取数据?

    免责声明 我知道这是一种不好的做事方式 这是我们与客户的唯一选择 Problem 我们需要每隔 x 时间从 Excel 文件读取数据 数据通过第三方 Excel 插件不断变化 应用程序的环境是 Windows XP SP1 和 Net 2
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • 使用私有构造函数的 C# 单元测试类?

    好吧 我刚刚收到一个作业 我必须对具有私有构造函数的类执行单元测试 现在 当所有方法也都是非静态时 我该如何在不初始化类的情况下进行单元测试 有什么方法可以对具有私有构造函数的类进行单元测试 无需反射 如果您无法将类公开 您仍然可以通过以下
  • 如何在 Rails for Android 中使用 gzip 压缩 JSON?

    我正在运行 Rails 3 2 7 和 Ruby 1 9 3p194 以从 SQLite 数据库输出 JSON 数据 render json gt result to json Android 应用程序使用通过以下方式加载的 JSON 文件
  • 测试从 ComboBox 派生的自定义控件

    我创建了一个从 ComboBox 派生的控件 并希望对其行为进行单元测试 但是 它在我的单元测试中的行为似乎与实际应用程序中的行为不同 在实际应用程序中 Combobox DataSource 属性和 Items 同步 换句话说 当我更改
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • UWP - 绑定枚举差异

    我遇到了一个非常有趣的问题 假设 UWP 应用中有以下 XAML 页面内容
  • argc 和 argv 在 Windows 中没有用吗?

    在 Linux 中 argc 和 argv 计算终端中的参数 但在 Windows 中 我找不到放置第二个参数的地方 事实上 每次我运行该程序时 它都会创建那个丑陋的黑色窗口 我什至没有机会给出任何争论 那么这两个变量在Windows平台下
  • 如何在 C++ 中初始化嵌套类的构造函数

    我在初始化嵌套类构造函数时遇到问题 这是我的代码 include
  • 内存不足异常

    我正在使用 C 和 asp net 开发一个网络应用程序 我一直收到内存不足的异常 该应用程序的作用是从数据源读取一堆记录 产品 可能是数百 数千 通过向导中的设置处理这些记录 然后使用处理的产品信息更新不同的数据源 虽然有多个 DB 类
  • 合并大文件的最佳方法是什么?

    我必须合并数千个大文件 每个大约 200MB 我想知道合并这些文件的最佳方法是什么 行将有条件地复制到合并文件中 可以使用 File AppendAllLines 或使用 Stream CopyTo 吗 使用 File AppendAllL
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不

随机推荐

  • 使用 Set 而不是 List 会导致“无法写入 JSON:无限递归”异常

    我收到错误 无法编写 JSON 无限递归 当尝试访问端点时http localhost 8080 categoryOfPermissions http localhost 8080 categoryOfPermissions 我研究并找到了
  • 如何将浮动列表项居中?

    我的网站导航有需要居中的列表项 我处于浮动状态 以便可以在列表项上进行填充 将它们设置为内联似乎可以消除顶部和底部填充 div ul ul div
  • SVG 线条描边-dasharray 无法正确打印为 PDF

    打印行与stroke dasharrayPDF 创建不同的行为 请 看着那 这image https i stack imgur com doOku png here 图A 我直接从浏览器 Chrome 获取的屏幕截图 图B是同一页面的打印
  • 如何将画布转换为图像以上传到烧瓶?

    好吧 我正在尝试将调整大小的画布图像作为文件上传到 Flask 首先我尝试使用canvas toDataURL 将其转换为 base64 字符串 然后尝试使用以下命令将其作为图像上传formdata使用AJAX 就没那么幸运了 然后我尝试使
  • Castle.Windsor可以自动解析具体类型吗

    我们正在评估 C 项目的 IoC 容器 Unity 和 Castle Windsor 都表现出色 我喜欢 Unity 的一件事 NInject 和 StructureMap 也这样做 是 显而易见如何构造它们的类型不必向 IoC 容器注册
  • 使 DateTime::createFromFormat() 返回子类而不是父类

    我正在延长DateTime添加一些有用的方法和常量 使用时new创建一个新对象一切都很好 但是使用静态方法时createFromFormat它总是返回原来的DateTime对象 当然没有任何子方法可用 我正在使用以下代码来规避此问题 这是最
  • 以编程方式将样式应用于 MaterialButton

    我正在尝试创建一个扩展自的自定义视图MaterialButton并在代码中应用样式 这样我就不需要在 xml 中执行它 class CustomRedButton JvmOverloads constructor context Conte
  • 用于替换格式但保留单元格值的 VBA:部分解决

    我正在尝试组合 VBA 来搜索特定的单元格格式 然后更改该单元格格式 我从这篇文章中得到了灵感 Excel VBA 值替换后仍保持字符串格式 https stackoverflow com questions 25825136 excel
  • 当 SQL 包含变量时在 pgAdmin 中调试 SQL

    在 SQL Server 中 我可以从应用程序中复制 sql 代码并将其粘贴到 SSMS 中 声明并分配 sql 中存在的变量并运行 是的 很棒的调试场景 例如 请注意 我很生疏 语法可能不正确 declare x as varchar 1
  • 在 PowerShell 中提示用户输入

    我想提示用户进行一系列输入 包括密码和文件名 我有一个使用的例子host ui prompt 这似乎很合理 但我无法理解回报 有没有更好的方法在 PowerShell 中获取用户输入 Read Host http technet micro
  • HTML 中的字符限制

    如何对 HTML 中的文本输入施加字符限制 主要有2个解决方案 纯 HTML 的
  • 您可以通过 JavaScript 获取用户本地 LAN IP 地址吗?

    我知道对这个问题的最初反应是 不 和 它无法完成 和 你不应该需要它 你做错了 我想做的是获取用户的 LAN IP 地址 并将其显示在网页上 为什么 因为这就是我正在开发的页面的全部内容 显示尽可能多的关于您 访问者 的信息 https w
  • Pandas DataFrame 到嵌套 JSON 而不更改数据结构

    I have pandas DataFrame import pandas as pd import json df pd DataFrame 2016 04 30T20 02 25 693Z vmPowerOn vmName 2016 0
  • 如何将自定义 ISpecimenBuilders 与 OmitOnRecursionBehavior 结合使用?

    我如何使用自定义ISpecimenBuilder实例以及OmitOnRecursionBehavior我想将其全局应用于所有夹具创建的对象 我正在使用一个带有难闻的循环引用的 EF Code First 模型 就这个问题而言 无法消除该循环
  • Wpf ScrollViewer 滚动量

    是否可以更改 WPF ScrollViewer 滚动的量 我只是想知道是否可以更改滚动查看器 以便在使用鼠标滚轮或滚动查看器箭头时可以更改增量滚动量 简短的答案是 如果不编写一些自定义滚动代码 就无法做到这一点 但不要让这吓到你 这并不那么
  • 在 UI 更新或触摸事件之前动画不会开始

    我有一个奇怪的问题AlphaAnimation 它应该在以下情况下重复运行 AsyncTask调用处理程序 但是 第一次调用处理程序时Activity 除非我触摸屏幕或更新 UI 例如按手机的菜单按钮 否则动画不会启动 奇怪的是 一旦动画至
  • 更改 IIS URL 重写规则中的查询字符串值

    到目前为止我已经尝试了多种组合但没有运气 我有一个如下所示的网址 https teams company com Search pages results aspx url https teams2017 company com sites
  • Zend Framework 2 - 整数表单验证

    我有以下问题 我 根据教程 编写了一个表单验证 文本字段工作得很好 但整数字段的行为很奇怪 这是我的验证器 inputFilter gt add factory gt createInput array name gt zip requir
  • 将 IMPORTXML Xpath 查询格式化为 Google 表格的可读数据

    我正在将 XML 数据导入到具有以下结构的 google 工作表中 编辑 网址 https sonicstate com news tools revive stats client camp 3785 xml https sonicsta
  • 从Lua到C的Lua嵌套表

    我不幸未能将嵌套 Lua 表转换为 C json 对象 我正在使用 LuaTableToJson 请参阅后面的代码 其中 index 是要检索的参数索引 PopOneArg 是根据值的类型处理值的例程 当有嵌套表时 我想递归地调用 LuaT