hello,
I'm working on a mod that use the game.table_to_json function a lot.
The problem I face is that, in Lua, setting a table value to nil is equivalent to removing this value from the table and because of this the fields does not appear in the json, but I have plenty of usecases where I need some fields on the final json string to appear (null or not).
So here's my proposition: add an optional argument to table_to_json that is an array, specifying the fields that need to be set to null in the json representation if they are not found in the table.
The problem i have with that is that it doesn't work for nested fields (but maybe someone will have an idea to work around that).
Also adding a "null placeholder" object that is converted to null when passed to the table_to_json function is not a solution because it will break the codes that rely on table length and fields existence, and make object that have no sens outside of the table_to_json function occupying memory.
I hope you will find my suggestion relevant and that it is not a duplicate.
Add a way to have null fields in game.table_to_json() function
Moderator: ickputzdirwech
Re: Add a way to have null fields in game.table_to_json() function
(edited after more reading) Your post already explains why the suggestion as written is cumbersome and incomplete. Table keys that were set to nil don't exist, ergo every possible table key is set to nil besides the ones that aren't. You can't print them all, so which nil values do you decide to print? Only your specific application code can know, unless you narrow your suggestion to a particular scenario like Lua objects.
The suggested method of using an array of fields that default to printing nil can be implemented as a six-line helper function in your code or a library, which should work fine for your application. It should not be part of table_to_json itself.
Function setTableNilFields(tab, keys)
For _,key in pairs(keys) do
Tab[key] = tab[key] or "nil"
End
Return tab
End
This reads like an X-Y problem: why does the code *reading* the JSON file need to know which values were *set* to nil? They don't exist. So really, you are trying to send some other information by having them explicitly written in the file as nil. You can find another way to send that information in the JSON. Maybe by setting particular keys to the string "nil", or maybe you can add a more explicit key like "vehicle-color-was-cleared-by-user"=true.
The suggested method of using an array of fields that default to printing nil can be implemented as a six-line helper function in your code or a library, which should work fine for your application. It should not be part of table_to_json itself.
Function setTableNilFields(tab, keys)
For _,key in pairs(keys) do
Tab[key] = tab[key] or "nil"
End
Return tab
End
This reads like an X-Y problem: why does the code *reading* the JSON file need to know which values were *set* to nil? They don't exist. So really, you are trying to send some other information by having them explicitly written in the file as nil. You can find another way to send that information in the JSON. Maybe by setting particular keys to the string "nil", or maybe you can add a more explicit key like "vehicle-color-was-cleared-by-user"=true.
My mods: Multiple Unit Train Control, Smart Artillery Wagons
Maintainer of Vehicle Wagon 2, Cargo Ships, Honk
Maintainer of Vehicle Wagon 2, Cargo Ships, Honk
Re: Add a way to have null fields in game.table_to_json() function
This is a straightforward `jq` filter, object addition defaults to the field values on the left if they're missing on the right so just supply your defaults that way. No point reimplementing existing tools.
Re: Add a way to have null fields in game.table_to_json() function
I should have thought of this first. You can use the existing util.merge function in the Factorio core Lualib:
util.merge({defaults, input})
util.merge({defaults, input})
My mods: Multiple Unit Train Control, Smart Artillery Wagons
Maintainer of Vehicle Wagon 2, Cargo Ships, Honk
Maintainer of Vehicle Wagon 2, Cargo Ships, Honk