json_macros 0.3.2

Convenience macros for constructing JSON objects from literals.
# json_macros

[![Crates.io](https://img.shields.io/crates/v/json_macros.svg)](https://crates.io/crates/json_macros)
[![Build Status](https://travis-ci.org/tomjakubowski/json_macros.svg?branch=master)]
(https://travis-ci.org/tomjakubowski/json_macros)

``` rust
let properties = json! {
    "menu": {
        "id": "file",
        "value": "File",
        "popup": {
            "menuitem": [
                {"value": "New", "onclick": "CreateNewDoc()"},
                {"value": "Open", "onclick": "OpenDoc()"},
                {"value": "Close", "onclick": "CloseDoc()"}
            ]
        }
    }
};

let menu_value = properties.find_path(["menu", "value"])
    .map(|x| x.as_string());

assert_eq!(menu_value, Some("File"));
```

Use JSON-like literals in Rust to construct [`serde_json`][] `Value`s
or [`rustc-serialize`][] `Json` values.

Because `json_macros` is a compiler plugin, it's only compatible with
the Rust [nightly channel][rust-nightly].

Depending on your project's needs, you may ask `json_macros` to
generate code that constructs [`serde_json`][] values or code that
constructs [`rustc-serialize`][] values.

## Using json_macros with rustc-serialize

By default, `json_macros` generates code for `rustc-serialize`.  In a
future release, the default may switch to `serde_json`, but
`json_macros` should be at least optionally compatible with
`rustc-serialize` for as long as that crate is supported.

To use `json_macros` with `rustc-serialize`, add both packages as
dependencies to your `Cargo.toml`.

```toml
[dependencies]
json_macros = "^0.3"
rustc-serialize = "^0.3"
```

Your crate will also need to link with `rustc_serialize` and `use` it
in any submodule that uses the `json!()` macro.

```rust
extern crate rustc_serialize;

// ...

mod foo {
    use rustc_serialize;
    // ...
}
```

### Example

```rust
#![feature(plugin)]
#![plugin(json_macros)]

extern crate rustc_serialize;

pub fn main() {
    let x = 123i32;
    println!("{}", json!({ // object literal
        "foo": "foooooo", // string literal keys and values
        "bar": [true, null, 123, 123.4], // array, boolean, null, numeric literals
        "quux": { // nest as deeply as you like
          "a": [1, 2, 3, 4],
          "b": { "a": null },
          "c": false
        },
        "waldo": (192 - x) // wrap in parens to splice ToJson expressions directly
    }).pretty().to_string());
}
```

## Using json_macros with serde_json

To use `json_macros` with `serde_json`, add both packages as
dependencies to your `Cargo.toml`.  Enable the `with-serde_json`
feature for `json_macros` and disable the default features so as to
not depend on `rustc-serialize`.

```toml
[dependencies]
rustc-serialize = "^0.3"

[dependencies.json_macros]
version = "^0.3"
default-features = false
features = ["with-serde"]
```

Your crate will also need to link with `serde_json` and `use` it in
any submodule that uses the `json!()` macro.

```rust
extern crate serde_json;

// ...

mod foo {
    use serde_json;
    // ...
}
```

### Example

```rust
#![feature(plugin)]
#![plugin(json_macros)]

extern crate serde_json;

pub fn main() {
    let x = 123i32;
    println!("{}", serde_json::to_string_pretty(&json!({ // object literal
        "foo": "foooooo", // string literal keys and values
        "bar": [true, null, 123, 123.4], // array, boolean, null, numeric literals
        "quux": { // nest as deeply as you like
          "a": [1, 2, 3, 4],
          "b": { "a": null },
          "c": false
        },
        "waldo": (192 - x) // wrap in parens to splice ToJson expressions directly
    })).unwrap());
}
```

[`serde_json`]: <https://github.com/serde-rs/json>
[`rustc-serialize`]: <https://doc.rust-lang.org/rustc-serialize/rustc_serialize/index.html>
[rust-nightly]: <http://doc.rust-lang.org/book/nightly-rust.html>