#serde-json #json-object #json #macro #serialization #serde

nightly json_macros

Convenience macros for constructing JSON objects from literals

20 releases

Uses old Rust 2015

0.3.2 Jul 19, 2016
0.3.0 Jan 5, 2016
0.2.6 Dec 7, 2015
0.2.5 Jul 30, 2015
0.0.3 Nov 23, 2014

#1529 in Encoding

Download history 3/week @ 2024-07-22 43/week @ 2024-09-23

74 downloads per month
Used in 2 crates

MIT license

12KB
180 lines

json_macros

Crates.io [Build Status] (https://travis-ci.org/tomjakubowski/json_macros)

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 Values or rustc-serialize Json values.

Because json_macros is a compiler plugin, it's only compatible with the Rust nightly channel.

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.

[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.

extern crate rustc_serialize;

// ...

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

Example

#![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.

[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.

extern crate serde_json;

// ...

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

Example

#![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());
}

Dependencies

~0–360KB