# Momoa JSON by [Nicholas C. Zakas](https://humanwhocodes.com) If you find this useful, please consider supporting my work with a [donation](https://humanwhocodes.com/donate). ## About Momoa is a general purpose JSON utility toolkit, containing: * A **tokenizer** that allows you to separate a JSON string into its component parts. * A ECMA-404 compliant **parser** that produces an abstract syntax tree (AST) representing everything inside of a JSON string. ## Background A tool like Momoa comes in handy when you want to know not just the result of JSON parsing, but exactly what is contained in the original JSON string. ## Usage ### Parsing There are two parsing methods: one for JSON and one for JSONC. To parse a JSON string into an AST, use the `json::parse()` function: ```rs use momoa::ast::*; use momoa::json; fn do_parse(code) -> Node { let ast = json::parse(code).unwrap(); // do something with ast ast } ``` To allow trailing commas in JSON, use the `json::parse_with_trailing_commas()` function: ```rs use momoa::ast::*; use momoa::json; fn do_parse(code) -> Node { let ast = json::parse_with_trailing_commas(code).unwrap(); // do something with ast ast } ``` To parse a JSONC string into an AST, use the `jsonc::parse()` function: ```rs use momoa::ast::*; use momoa::jsonc; fn do_parse(code) -> Node { let ast = jsonc::parse(code).unwrap(); // do something with ast ast } ``` To allow trailing commas in JSONC, use the `jsonc::parse_with_trailing_commas()` function: ```rs use momoa::ast::*; use momoa::jsonc; fn do_parse(code) -> Node { let ast = jsonc::parse_with_trailing_commas(code).unwrap(); // do something with ast ast } ``` ### Tokenizing To produce JSON tokens from a string, use the `json::tokenize()` function: ```rs use momoa::*; fn do_parse(code) -> Vec { let result = json::tokenize(code).unwrap(); // do something with ast result } ``` To produce JSON tokens from a string, use the `jsonc::tokenize()` function: ```rs use momoa::*; fn do_parse(code) -> Vec { let result = jsonc::tokenize(code).unwrap(); // do something with ast result } ``` ## Development To work on Momoa, you'll need: * [Git](https://git-scm.com/) * [Rust](https://rustup.rs) Make sure both are installed by visiting the links and following the instructions to install. Now you're ready to clone the repository: ```bash git clone https://github.com/humanwhocodes/momoa.git ``` Then, enter the directory and install the dependencies: ```bash cd momoa/rust cargo build ``` After that, you can run the tests via: ```bash cargo test ``` ## License Apache 2.0 ## Frequently Asked Questions ### What does "Momoa" even mean? Momoa is the last name of American actor [Jason Momoa](https://en.wikipedia.org/wiki/Jason_Momoa). Because "JSON" is pronounced "Jason", I wanted a name that played off of this fact. The most obvious choice would have been something related to [Jason and the Argonauts](https://en.wikipedia.org/wiki/Jason_and_the_Argonauts_(1963_film)), as this movie is referenced in the [JSON specification](https://ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf) directly. However, both "Argo" and "Argonaut" were already used for open source projects. When I did a search for "Jason" online, Jason Momoa was the first result that came up. He always plays badass characters so it seemed to fit. ### Why support comments in JSON? There are a number of programs that allow C-style comments in JSON files, most notably, configuration files for [Visual Studio Code](https://code.visualstudio.com). As there seems to be a need for this functionality, I decided to add it out-of-the-box.