# fson **FSON** _(Flexible Serialized Object Notation)_ is an extension for JSON that is used primarily for configuration. The user can quickly configure the configuration using [**references**](#features) or a [**template strings**](#features). # Features ## Comments and new values ``` /* Multiline comment */ [null, NaN, Infinity, -Infinity, 0x1ABC /*Hexadecimal*/] // Single comment ``` ## Identifiers - You can use identifiers without quotes and with single quotes: ``` { "double quotes": null, 'single quotes': null, withoutQuotes: null } ``` ## References - A **reference** is an object **that can be anywhere (it can be either a pair of an object or it can be in an array)** that can be referenced using it's identifier or path. For example: ``` { something: { key: #{ #id: "identifier"; #value: "value"; } } } ``` - The **reference** in the example above can be referenced in two ways: - Using it's identifier: `#identifier` or `#"identifier"` - Using it's path: `#/something/identifier` or `#/"something"/"identifier"` ## Template strings - **Template strings** are strings enclosed in backticks. They allow you to embed other values **(including [references](#references))** in them using `${value}`. For example: ``` { x: 5, something: `x is ${x}` } ``` ## Other - Objects and arrays can have a trailing comma: `{ x: { y: [], }, }` - Numbers can start with a plus: `+1.5` - Strings can be multiline: ``` "hello world" ``` - Whitespaces don't matter # Examples See all examples in [Examples](examples) directory.
How to run example: `cargo run --example EXAMPLE_NAME` # Compiling to WebAssembly **FSON** is already ready for compilation to **WebAssembly** and already has the necessary functions. `js-sys` and `wasm-bindgen` libraries and functions are used only when compiling to **WebAssembly**.
Use these commands to compile to wasm: ``` # Install wasm-pack cargo install wasm-pack # Compile to wasm wasm-pack build --target web ```
JavaScript example ```js import init, { parse, stringify } from "./jsonparser.js"; init().then(() => { console.log(stringify({ // Creating reference x: { "#id": "test", "#value": "value", }, // Using reference y: [ // Identifier { "#reference_id": "test" }, // Path { "#reference_path": ["x"] }, // Template string { "@template_string": [ "test is ", { "#reference_id": "test" }, /* Reference */ "; 2 + 2 = ", 4, /* Normal value */ ], }, ], })); }); ```
# License MIT