Crate json [−] [src]
JSON in Rust
Parse and serialize JSON with ease.
Complete Documentation - Cargo - Repository
Why?
JSON is a very loose format where anything goes - arrays can hold mixed types, object keys can change types between API calls or not include some keys under some conditions. Mapping that to idiomatic Rust structs introduces friction.
This crate intends to avoid that friction by using extensive static dispatch and hiding type information behind enums, while still giving you all the safety guarantees of safe Rust code.
let data = json::parse(r#" { "code": 200, "success": true, "payload": { "features": [ "awesome", "easyAPI", "lowLearningCurve" ] } } "#).unwrap(); assert!(data["code"].is(200)); assert!(data["success"].is(true)); assert!(data["payload"]["features"].is_array()); assert!(data["payload"]["features"][0].is("awesome")); assert!(data["payload"]["features"].contains("easyAPI")); // Error resilient: non-existent values default to null assert!(data["this"]["does"]["not"]["exist"].is_null());
Easily create JSON data without defining structs
#[macro_use] extern crate json; fn main() { let data = object!{ "a" => "bar", "b" => array![1, false, "foo"] }; assert_eq!(json::stringify(data), r#"{"a":"bar","b":[1,false,"foo"]}"#); }
Serialize with json::stringify(value)
Primitives:
// str slices assert_eq!(json::stringify("foobar"), "\"foobar\""); // Owned strings assert_eq!(json::stringify("foobar".to_string()), "\"foobar\""); // Any number types assert_eq!(json::stringify(42), "42"); // Booleans assert_eq!(json::stringify(true), "true"); assert_eq!(json::stringify(false), "false");
Explicit null
type json::Null
:
assert_eq!(json::stringify(json::Null), "null");
Optional types:
let value: Option<String> = Some("foo".to_string()); assert_eq!(json::stringify(value), "\"foo\""); let no_value: Option<String> = None; assert_eq!(json::stringify(no_value), "null");
Vector:
let data = vec![1,2,3]; assert_eq!(json::stringify(data), "[1,2,3]");
Vector with optional values:
let data = vec![Some(1), None, Some(2), None, Some(3)]; assert_eq!(json::stringify(data), "[1,null,2,null,3]");
Pushing to arrays:
let mut data = json::JsonValue::new_array(); data.push(10); data.push("foo"); data.push(false); assert_eq!(json::stringify(data), "[10,\"foo\",false]");
Putting fields on objects:
let mut data = json::JsonValue::new_object(); data.put("answer", 42); data.put("foo", "bar"); assert_eq!(json::stringify(data), "{\"answer\":42,\"foo\":\"bar\"}");
array!
macro:
let data = array!["foo", "bar", 100, true, json::Null]; assert_eq!(json::stringify(data), "[\"foo\",\"bar\",100,true,null]");
object!
macro:
let data = object!{ "name" => "John Doe", "age" => 30, "canJSON" => true }; assert_eq!( json::stringify(data), // Because object is internally using a BTreeMap, // the key order is alphabetical "{\"age\":30,\"canJSON\":true,\"name\":\"John Doe\"}" );
Reexports
pub use value::JsonValue::Null; |
Modules
iterators |
Macros
array! | |
object! |
Enums
JsonError | |
JsonValue |
Functions
parse | |
stringify | |
stringify_ref |
Type Definitions
Array | |
JsonResult | |
Object |