macro_rules! json {
    (@array [$($elems:expr,)*]) => { ... };
    (@array [$($elems:expr),*]) => { ... };
    (@array [$($elems:expr,)*] null @ $meta:expr $(,$($rest:tt)*)?) => { ... };
    (@array [$($elems:expr,)*] null $($rest:tt)*) => { ... };
    (@array [$($elems:expr,)*] true @ $meta:expr $(,$($rest:tt)*)?) => { ... };
    (@array [$($elems:expr,)*] true $($rest:tt)*) => { ... };
    (@array [$($elems:expr,)*] false @ $meta:expr $(,$($rest:tt)*)?) => { ... };
    (@array [$($elems:expr,)*] false $($rest:tt)*) => { ... };
    (@array [$($elems:expr,)*] $lit:literal @ $meta:expr $(,$($rest:tt)*)?) => { ... };
    (@array [$($elems:expr,)*] $lit:literal $($rest:tt)*) => { ... };
    (@array [$($elems:expr,)*] [$($array:tt)*] @ $meta:expr $(,$($rest:tt)*)?) => { ... };
    (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => { ... };
    (@array [$($elems:expr,)*] {$($map:tt)*} @ $meta:expr $(,$($rest:tt)*)?) => { ... };
    (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => { ... };
    (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => { ... };
    (@array [$($elems:expr,)*] $last:expr) => { ... };
    (@array [$($elems:expr),*] , $($rest:tt)*) => { ... };
    (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => { ... };
    (@object [$($elems:expr,)*] () () ()) => { ... };
    (@object [$($elems:expr),*] () () ()) => { ... };
    (@key (($key:literal @ $meta:expr))) => { ... };
    (@key ($key:literal)) => { ... };
    (@key ($key:expr)) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: null @ $meta:expr $(,$($rest:tt)*)?) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: null $($rest:tt)*) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: true @ $meta:expr $(,$($rest:tt)*)?) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: true $($rest:tt)*) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: false @ $meta:expr $(,$($rest:tt)*)?) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: false $($rest:tt)*) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: $lit:literal @ $meta:expr $(,$($rest:tt)*)?) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: $lit:literal $($rest:tt)*) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: [$($array:tt)*] @ $meta:expr $(,$($rest:tt)*)?) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: [$($array:tt)*] $($rest:tt)*) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: {$($map:tt)*} @ $meta:expr $(,$($rest:tt)*)?) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: {$($map:tt)*} $($rest:tt)*) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: $next:expr, $($rest:tt)*) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (: $last:expr) $copy:tt) => { ... };
    (@object [$($elems:expr),*] () (, $($rest:tt)*) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) (:) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)+) () $copy:tt) => { ... };
    (@object [$($elems:expr,)*] () (: $($rest:tt)*) ($colon:tt $($copy:tt)*)) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)*) (, $($rest:tt)*) ($comma:tt $($copy:tt)*)) => { ... };
    (@object [$($elems:expr,)*] () (($key:expr) : $($rest:tt)*) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)*) (: $($unexpected:tt)+) $copy:tt) => { ... };
    (@object [$($elems:expr,)*] ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => { ... };
    (null @ $meta:expr) => { ... };
    (null) => { ... };
    (true @ $meta:expr) => { ... };
    (true) => { ... };
    (false @ $meta:expr) => { ... };
    (false) => { ... };
    ($lit:literal @ $meta:expr) => { ... };
    ($lit:literal) => { ... };
    ([] @ $meta:expr) => { ... };
    ([]) => { ... };
    ([ $($tt:tt)+ ] @ $meta:expr) => { ... };
    ([ $($tt:tt)+ ]) => { ... };
    ({} @ $meta:expr) => { ... };
    ({}) => { ... };
    ({ $($tt:tt)+ } @ $meta:expr) => { ... };
    ({ $($tt:tt)+ }) => { ... };
    ($other:expr) => { ... };
}
Expand description

Constructs a Loc<json_syntax::Value, (), ()> from a JSON literal.

let value: Meta<Value<()>, ()> = json!({
    "code": 200,
    "success": true,
    "payload": {
        "features": [
            "json",
            "syntax"
        ]
    }
});

Variables or expressions can be interpolated into the JSON literal.

let code = 200;
let features = vec!["json", "syntax"];

let value: Meta<Value<()>, ()> = json!({
    "code": Meta(Value::from(code), ()),
    "success": Meta(Value::from(code == 200), ()),
    "payload": {
        Meta(Key::from(features[0]), ()): Meta(Value::from(features[1]), ())
    }
});

Trailing commas are allowed inside both arrays and objects.

let value: Meta<Value<()>, ()> = json!([
    "notice",
    "the",
    "trailing",
    "comma -->",
]);

Metadata information can be added using the @ symbol.

let value: Meta<Value<u8>, u8> = json!({
    "code": 200 @ 0,
    "success": true @ 1,
    "payload": {
        "features": [
            "json" @ 2,
            "syntax" @ 3
        ]
    }
});