View Source JSONC (jsonc v0.9.0)
This is a package for decoding jsonc documents and also transcoding them to json. I'm also working on it to add a formatter.
jsonc is a superset of json, which means any json document is also a jsonc document but the reverse is not true. So you can use this package to decode json documents too.
jsonc allows you to have single-line and multi-line comments in your documents using //
and /* */
. these comments can be anywhere.
you can also have multi-line strings that don't need escaping using `
(backtick).
also, strings and object keys may be unquoted. but any unquoated string that can be intrepreted as a number(whether integer or float), will be treated as such.
you also don't need to use commas for separating key-value pairs in objets or elements in arrays, whitespace is enough.
This is an example of a valid jsonc document:
// a valid jsonc document
{
/* you can have
multi-line comments
*/
key1 /* object keys can be unquoted */ : value // you don't need a comma here
key2: [ 25.23e-5 74 unquoated_string ]
key3: `this
is a
multi-line string`,
"regular_key": "regular_string"
}
I should say that right now, the performance for large documents is not acceptable, so use this package only when human-readability is more important than performance, like using a jsonc file for specifying environmental variables for your app (for example with enux). but I'll definitely keep working on optimising the parser or maybe writing a new parser if needed.
installation
Installation
defp deps do
[
{:jsonc, "~> 0.9.0"}
]
end
usage
Usage
iex(1)> JSONC.decode!(~s(// language information \n { name: elixir github_stars: 19.8e3 forks: 2.8e3 creator: "José Valim" 😔 : 😃 }))
%{
"creator" => "José Valim",
"forks" => 2.8e3,
"github_stars" => 1.98e4,
"name" => "elixir",
"😔" => "😃"
}
iex(2)> JSONC.transcode!(~s(// language information \n { name: elixir github_stars: 19.8e3 forks: 2.8e3 creator: "José Valim" 😔 : 😃 }))
"{\n \"name\": "elixir\",\n \"github_stars\": 1.98e4,\n \"forks\": 2.8e3,\n \"creator": \"José Valim\"\n "😔": "😃"\n}"