4 ms·
Yeah, I'm pretty sure there are exactly two substantive problems with JSON for (static) configuration file use cases, which are comments and multiline strings (
by throwaway894345 3y ago
Yeah, I'm pretty sure there are exactly two substantive problems with JSON for (static) configuration file use cases, which are comments and multiline strings (especially with sane handling of indentation). YAML fixes these, but it adds so much complexity in the process including such a predictable footgun of unquoted strings (the no/false problem is particularly glaring/absurd, but it's also easy to forget to quote other boolean values or numbers in a long list of other strings).
- radlad 3y agoCan I add "trailing commas are invalid" to the list?
- throwaway894345 3y agoPlease do.
- MathMonkeyMan 3y agoSolutions abound, but one option is to use either Javascript (config.js): // comments! ({ no_quotes: [1, 2, (() => /* code! */)()], ... }) Or, let the whole thing be a function. Then your config can have parameters, maybe mapped from environment variables or something. ({foo, bar, ...kwargs}) => ({ datacenter: foo === 'old' ? 'useast1' : 'uswest', ... }) Can do as Crockford says, and write in the JSON subset of Javascript, but with comments, and convert it to JSON by running it through a JS minifier. I think you need parens around the object, though, or else it looks like a code block (boooo...): ({ // This is very much like JSON "foo": [1, 2, "bar"] }) Python also has JSON-like syntax, so you could use config.py: { 'foo': [1, 2, 'bar'] } That would require a wrapper script. Or, you can have the self-contained convention: import json import sys # Yay, comments! json.dump({ # more comments! 'foo': [1, 2, 'bar'] }, sys.stdout)
- throwaway894345 3y agoYeah, I'm mostly just not sure I want to put a full programming language interpreter in my application, especially Python which is not designed to be embeddable. Moreover, I would really want something that is typed, like TypeScript, but libraries for embedded TypeScript interpreters are even more rare :/.
- MathMonkeyMan 3y agoI figure we'd leave it to the build/deploy/CI/development whatever system. I also don't want to extend or embed my application with a full-blown runtime if I don't have to. "source" config --> convert to JSON config "on the fly" --> app that expects JSON edit: I worked on a C++ team that used `std::system` to invoke the system python interpreter when loading a config file. My teammates weren't morons, either, it's just the simplest thing that worked and they knew that the config script and the surrounding file system were secure.
- LorenzoGood 3y agoOr you can produce Configuration with nix
- bobbylarrybobby 3y agojson5 is pretty good, if you can use it