如何在C#中解析带数字键的LuaTable?
NLua解析LuaTable数字键及转JSON解决方案
一、数字键访问失效的解决办法
- 点语法仅支持合法标识符(不能以数字开头),所以
mission.coalition.blue.country.1这种写法无法识别数字键1,必然返回null。 - 改用索引器语法直接访问:
mission.coalition.blue.country[1],这是NLua中访问数字键LuaTable元素的标准方式,和监视窗口中显示的键结构对应,能正确获取到对应值。
二、LuaTable转JSON的实现方案
不需要额外引用Lua库,直接在C#中通过NLua遍历处理即可,以下两种方法任选:
方法1:手动遍历构造JSON字符串
using NLua; using System.Text; public string LuaTableToJson(LuaTable table) { var sb = new StringBuilder(); sb.Append("{"); bool isFirstItem = true; foreach (var kvPair in table) { if (!isFirstItem) sb.Append(","); isFirstItem = false; string key = kvPair.Key.ToString(); object value = kvPair.Value; sb.Append($"\"{key}\":"); if (value is LuaTable subTable) sb.Append(LuaTableToJson(subTable)); else if (value is string strValue) sb.Append($"\"{strValue}\""); else if (value is int || value is float || value is double) sb.Append(value.ToString()); else sb.Append($"\"{value.ToString()}\""); } sb.Append("}"); return sb.ToString(); }
方法2:结合Json.NET序列化(更简洁)
先把LuaTable转成C#字典,再用Json.NET序列化:
using NLua; using Newtonsoft.Json; public object LuaTableToDict(LuaTable table) { var dict = new Dictionary<object, object>(); foreach (var kvPair in table) { object value = kvPair.Value; dict[kvPair.Key] = value is LuaTable subTable ? LuaTableToDict(subTable) : value; } return dict; } // 使用示例 var convertedDict = LuaTableToDict(mission.coalition.blue.country); string jsonString = JsonConvert.SerializeObject(convertedDict, Formatting.Indented);
注:如果项目没有Newtonsoft.Json,直接通过NuGet安装即可,无需额外Lua库。
内容的提问来源于stack exchange,提问作者Francisco Benito
相关产品推荐
相关产品推荐

