Я хотел бы передать сложные данные из службы C++ в приложение Lua. Это общение происходит по сети. Для простоты и скорости в приложении Lua я предпочел бы отправлять литералы литералов Lua (без необходимости отдельного парсера) вместо XML или JSON или YAML или таких.Сериализация таблицы Lua из C++ (через JSON)
Хотя существуют такие вещи, как библиотеки C++, которые пишут JSON, я не могу найти существующую библиотеку C++ для создания сериализованного Lua. Моя идея состоит в том, чтобы использовать существующую библиотеку JSON для C++, а затем преобразовать строку в Lua.
Так, например, я хотел бы преобразовать эту строку:
{
"hello":42,
"array":[1,2,{"more":false},null,true],
"worst":"still [null]: got it?"
}
в эту строку:
{
["hello"]=42,
["array"]={1,2,{["more"]=false},nil,true},
["worst"]="still [null]: got it?"
}
Наивный replace_all
превращающего в :
к =
, []
к {}
, и null
до nil
уничтожит содержимое внутри строк. Как я могу выполнить это преобразование?
Чтобы избежать проблем с XY problem я включил свой конец мотивацию на вершине и в названии, в случае, если строка преобразование JSON-> Lua является неправильным выбором.
Хм, не конвертировать содержимое внутри строк? Это не совсем-тривиально, но если вы можете это сделать, то это должно быть именно то, что вы описали, нет? Также на самом деле разбирать JSON от Lua IMHO не особо сложно. Быстрая версия LuaJSON с LPEG не обязательно будет медленнее, чем анализ фактического кода Lua, поэтому, если вы можете запустить этот сценарий, я думаю, что это более простой вариант. У меня лично не было проблем с этим (и в моем случае я использовал больше, чем просто источник данных на C++, поэтому JSON был логичным выбором). –
* Однако, один момент, о котором я забыл, заключается в том, что при использовании таблиц Lua вы можете фактически использовать автоматическое преобразование в байт-код, который должен сделать это заметно быстрее. Это может быть обход OTOH с использованием BSON или других сжатых форматов JSON. –
@BartekBanachewicz Возможно, я преждевременно оптимизирую, но мне трудно поверить, что LPEG LuaJSON находится где-то рядом так же быстро, как 'local t = loadstring ('return' ..json)()' – Phrogz