1# Serde JSON   [![Build Status]][travis] [![Latest Version]][crates.io] [![Rustc Version 1.36+]][rustc] 2 3[Build Status]: https://img.shields.io/github/workflow/status/serde-rs/json/CI/master 4[travis]: https://github.com/serde-rs/json/actions?query=branch%3Amaster 5[Latest Version]: https://img.shields.io/crates/v/serde_json.svg 6[crates.io]: https://crates.io/crates/serde\_json 7[Rustc Version 1.36+]: https://img.shields.io/badge/rustc-1.36+-lightgray.svg 8[rustc]: https://blog.rust-lang.org/2019/07/04/Rust-1.36.0.html 9 10**Serde is a framework for *ser*ializing and *de*serializing Rust data structures efficiently and generically.** 11 12--- 13 14```toml 15[dependencies] 16serde_json = "1.0" 17``` 18 19You may be looking for: 20 21- [JSON API documentation](https://docs.serde.rs/serde_json/) 22- [Serde API documentation](https://docs.serde.rs/serde/) 23- [Detailed documentation about Serde](https://serde.rs/) 24- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/derive.html) 25- [Release notes](https://github.com/serde-rs/json/releases) 26 27JSON is a ubiquitous open-standard format that uses human-readable text to 28transmit data objects consisting of key-value pairs. 29 30```json 31{ 32 "name": "John Doe", 33 "age": 43, 34 "address": { 35 "street": "10 Downing Street", 36 "city": "London" 37 }, 38 "phones": [ 39 "+44 1234567", 40 "+44 2345678" 41 ] 42} 43``` 44 45There are three common ways that you might find yourself needing to work 46with JSON data in Rust. 47 48 - **As text data.** An unprocessed string of JSON data that you receive on 49 an HTTP endpoint, read from a file, or prepare to send to a remote 50 server. 51 - **As an untyped or loosely typed representation.** Maybe you want to 52 check that some JSON data is valid before passing it on, but without 53 knowing the structure of what it contains. Or you want to do very basic 54 manipulations like insert a key in a particular spot. 55 - **As a strongly typed Rust data structure.** When you expect all or most 56 of your data to conform to a particular structure and want to get real 57 work done without JSON's loosey-goosey nature tripping you up. 58 59Serde JSON provides efficient, flexible, safe ways of converting data 60between each of these representations. 61 62## Operating on untyped JSON values 63 64Any valid JSON data can be manipulated in the following recursive enum 65representation. This data structure is [`serde_json::Value`][value]. 66 67```rust 68enum Value { 69 Null, 70 Bool(bool), 71 Number(Number), 72 String(String), 73 Array(Vec<Value>), 74 Object(Map<String, Value>), 75} 76``` 77 78A string of JSON data can be parsed into a `serde_json::Value` by the 79[`serde_json::from_str`][from_str] function. There is also 80[`from_slice`][from_slice] for parsing from a byte slice &[u8] and 81[`from_reader`][from_reader] for parsing from any `io::Read` like a File or 82a TCP stream. 83 84<div align="right"> 85<a href="https://play.rust-lang.org/?edition=2018&gist=d69d8e3156d4bb81c4461b60b772ab72" target="_blank"> 86<img align="center" width="85" src="https://raw.githubusercontent.com/serde-rs/serde-rs.github.io/master/img/runtab.png"> 87</a> 88</div> 89 90```rust 91use serde_json::{Result, Value}; 92 93fn untyped_example() -> Result<()> { 94 // Some JSON input data as a &str. Maybe this comes from the user. 95 let data = r#" 96 { 97 "name": "John Doe", 98 "age": 43, 99 "phones": [ 100 "+44 1234567", 101 "+44 2345678" 102 ] 103 }"#; 104 105 // Parse the string of data into serde_json::Value. 106 let v: Value = serde_json::from_str(data)?; 107 108 // Access parts of the data by indexing with square brackets. 109 println!("Please call {} at the number {}", v["name"], v["phones"][0]); 110 111 Ok(()) 112} 113``` 114 115The result of square bracket indexing like `v["name"]` is a borrow of the data 116at that index, so the type is `&Value`. A JSON map can be indexed with string 117keys, while a JSON array can be indexed with integer keys. If the type of the 118data is not right for the type with which it is being indexed, or if a map does 119not contain the key being indexed, or if the index into a vector is out of 120bounds, the returned element is `Value::Null`. 121 122When a `Value` is printed, it is printed as a JSON string. So in the code above, 123the output looks like `Please call "John Doe" at the number "+44 1234567"`. The 124quotation marks appear because `v["name"]` is a `&Value` containing a JSON 125string and its JSON representation is `"John Doe"`. Printing as a plain string 126without quotation marks involves converting from a JSON string to a Rust string 127with [`as_str()`] or avoiding the use of `Value` as described in the following 128section. 129 130[`as_str()`]: https://docs.serde.rs/serde_json/enum.Value.html#method.as_str 131 132The `Value` representation is sufficient for very basic tasks but can be tedious 133to work with for anything more significant. Error handling is verbose to 134implement correctly, for example imagine trying to detect the presence of 135unrecognized fields in the input data. The compiler is powerless to help you 136when you make a mistake, for example imagine typoing `v["name"]` as `v["nmae"]` 137in one of the dozens of places it is used in your code. 138 139## Parsing JSON as strongly typed data structures 140 141Serde provides a powerful way of mapping JSON data into Rust data structures 142largely automatically. 143 144<div align="right"> 145<a href="https://play.rust-lang.org/?edition=2018&gist=15cfab66d38ff8a15a9cf1d8d897ac68" target="_blank"> 146<img align="center" width="85" src="https://raw.githubusercontent.com/serde-rs/serde-rs.github.io/master/img/runtab.png"> 147</a> 148</div> 149 150```rust 151use serde::{Deserialize, Serialize}; 152use serde_json::Result; 153 154#[derive(Serialize, Deserialize)] 155struct Person { 156 name: String, 157 age: u8, 158 phones: Vec<String>, 159} 160 161fn typed_example() -> Result<()> { 162 // Some JSON input data as a &str. Maybe this comes from the user. 163 let data = r#" 164 { 165 "name": "John Doe", 166 "age": 43, 167 "phones": [ 168 "+44 1234567", 169 "+44 2345678" 170 ] 171 }"#; 172 173 // Parse the string of data into a Person object. This is exactly the 174 // same function as the one that produced serde_json::Value above, but 175 // now we are asking it for a Person as output. 176 let p: Person = serde_json::from_str(data)?; 177 178 // Do things just like with any other Rust data structure. 179 println!("Please call {} at the number {}", p.name, p.phones[0]); 180 181 Ok(()) 182} 183``` 184 185This is the same `serde_json::from_str` function as before, but this time we 186assign the return value to a variable of type `Person` so Serde will 187automatically interpret the input data as a `Person` and produce informative 188error messages if the layout does not conform to what a `Person` is expected 189to look like. 190 191Any type that implements Serde's `Deserialize` trait can be deserialized 192this way. This includes built-in Rust standard library types like `Vec<T>` 193and `HashMap<K, V>`, as well as any structs or enums annotated with 194`#[derive(Deserialize)]`. 195 196Once we have `p` of type `Person`, our IDE and the Rust compiler can help us 197use it correctly like they do for any other Rust code. The IDE can 198autocomplete field names to prevent typos, which was impossible in the 199`serde_json::Value` representation. And the Rust compiler can check that 200when we write `p.phones[0]`, then `p.phones` is guaranteed to be a 201`Vec<String>` so indexing into it makes sense and produces a `String`. 202 203The necessary setup for using Serde's derive macros is explained on the *[Using 204derive]* page of the Serde site. 205 206[Using derive]: https://serde.rs/derive.html 207 208## Constructing JSON values 209 210Serde JSON provides a [`json!` macro][macro] to build `serde_json::Value` 211objects with very natural JSON syntax. 212 213<div align="right"> 214<a href="https://play.rust-lang.org/?edition=2018&gist=6ccafad431d72b62e77cc34c8e879b24" target="_blank"> 215<img align="center" width="85" src="https://raw.githubusercontent.com/serde-rs/serde-rs.github.io/master/img/runtab.png"> 216</a> 217</div> 218 219```rust 220use serde_json::json; 221 222fn main() { 223 // The type of `john` is `serde_json::Value` 224 let john = json!({ 225 "name": "John Doe", 226 "age": 43, 227 "phones": [ 228 "+44 1234567", 229 "+44 2345678" 230 ] 231 }); 232 233 println!("first phone number: {}", john["phones"][0]); 234 235 // Convert to a string of JSON and print it out 236 println!("{}", john.to_string()); 237} 238``` 239 240The `Value::to_string()` function converts a `serde_json::Value` into a 241`String` of JSON text. 242 243One neat thing about the `json!` macro is that variables and expressions can 244be interpolated directly into the JSON value as you are building it. Serde 245will check at compile time that the value you are interpolating is able to 246be represented as JSON. 247 248<div align="right"> 249<a href="https://play.rust-lang.org/?edition=2018&gist=f9101a6e61dfc9e02c6a67f315ed24f2" target="_blank"> 250<img align="center" width="85" src="https://raw.githubusercontent.com/serde-rs/serde-rs.github.io/master/img/runtab.png"> 251</a> 252</div> 253 254```rust 255let full_name = "John Doe"; 256let age_last_year = 42; 257 258// The type of `john` is `serde_json::Value` 259let john = json!({ 260 "name": full_name, 261 "age": age_last_year + 1, 262 "phones": [ 263 format!("+44 {}", random_phone()) 264 ] 265}); 266``` 267 268This is amazingly convenient but we have the problem we had before with 269`Value` which is that the IDE and Rust compiler cannot help us if we get it 270wrong. Serde JSON provides a better way of serializing strongly-typed data 271structures into JSON text. 272 273## Creating JSON by serializing data structures 274 275A data structure can be converted to a JSON string by 276[`serde_json::to_string`][to_string]. There is also 277[`serde_json::to_vec`][to_vec] which serializes to a `Vec<u8>` and 278[`serde_json::to_writer`][to_writer] which serializes to any `io::Write` 279such as a File or a TCP stream. 280 281<div align="right"> 282<a href="https://play.rust-lang.org/?edition=2018&gist=3472242a08ed2ff88a944f2a2283b0ee" target="_blank"> 283<img align="center" width="85" src="https://raw.githubusercontent.com/serde-rs/serde-rs.github.io/master/img/runtab.png"> 284</a> 285</div> 286 287```rust 288use serde::{Deserialize, Serialize}; 289use serde_json::Result; 290 291#[derive(Serialize, Deserialize)] 292struct Address { 293 street: String, 294 city: String, 295} 296 297fn print_an_address() -> Result<()> { 298 // Some data structure. 299 let address = Address { 300 street: "10 Downing Street".to_owned(), 301 city: "London".to_owned(), 302 }; 303 304 // Serialize it to a JSON string. 305 let j = serde_json::to_string(&address)?; 306 307 // Print, write to a file, or send to an HTTP server. 308 println!("{}", j); 309 310 Ok(()) 311} 312``` 313 314Any type that implements Serde's `Serialize` trait can be serialized this 315way. This includes built-in Rust standard library types like `Vec<T>` and 316`HashMap<K, V>`, as well as any structs or enums annotated with 317`#[derive(Serialize)]`. 318 319## Performance 320 321It is fast. You should expect in the ballpark of 500 to 1000 megabytes per 322second deserialization and 600 to 900 megabytes per second serialization, 323depending on the characteristics of your data. This is competitive with the 324fastest C and C++ JSON libraries or even 30% faster for many use cases. 325Benchmarks live in the [serde-rs/json-benchmark] repo. 326 327[serde-rs/json-benchmark]: https://github.com/serde-rs/json-benchmark 328 329## Getting help 330 331Serde is one of the most widely used Rust libraries so any place that Rustaceans 332congregate will be able to help you out. For chat, consider trying the 333[#rust-questions] or [#rust-beginners] channels of the unofficial community 334Discord (invite: <https://discord.gg/rust-lang-community>), the [#rust-usage] or 335[#beginners] channels of the official Rust Project Discord (invite: 336<https://discord.gg/rust-lang>), or the [#general][zulip] stream in Zulip. For 337asynchronous, consider the [\[rust\] tag on StackOverflow][stackoverflow], the 338[/r/rust] subreddit which has a pinned weekly easy questions post, or the Rust 339[Discourse forum][discourse]. It's acceptable to file a support issue in this 340repo but they tend not to get as many eyes as any of the above and may get 341closed without a response after some time. 342 343[#rust-questions]: https://discord.com/channels/273534239310479360/274215136414400513 344[#rust-beginners]: https://discord.com/channels/273534239310479360/273541522815713281 345[#rust-usage]: https://discord.com/channels/442252698964721669/443150878111694848 346[#beginners]: https://discord.com/channels/442252698964721669/448238009733742612 347[zulip]: https://rust-lang.zulipchat.com/#narrow/stream/122651-general 348[stackoverflow]: https://stackoverflow.com/questions/tagged/rust 349[/r/rust]: https://www.reddit.com/r/rust 350[discourse]: https://users.rust-lang.org 351 352## No-std support 353 354As long as there is a memory allocator, it is possible to use serde_json without 355the rest of the Rust standard library. This is supported on Rust 1.36+. Disable 356the default "std" feature and enable the "alloc" feature: 357 358```toml 359[dependencies] 360serde_json = { version = "1.0", default-features = false, features = ["alloc"] } 361``` 362 363For JSON support in Serde without a memory allocator, please see the 364[`serde-json-core`] crate. 365 366[`serde-json-core`]: https://github.com/rust-embedded-community/serde-json-core 367 368[value]: https://docs.serde.rs/serde_json/value/enum.Value.html 369[from_str]: https://docs.serde.rs/serde_json/de/fn.from_str.html 370[from_slice]: https://docs.serde.rs/serde_json/de/fn.from_slice.html 371[from_reader]: https://docs.serde.rs/serde_json/de/fn.from_reader.html 372[to_string]: https://docs.serde.rs/serde_json/ser/fn.to_string.html 373[to_vec]: https://docs.serde.rs/serde_json/ser/fn.to_vec.html 374[to_writer]: https://docs.serde.rs/serde_json/ser/fn.to_writer.html 375[macro]: https://docs.serde.rs/serde_json/macro.json.html 376 377<br> 378 379#### License 380 381<sup> 382Licensed under either of <a href="LICENSE-APACHE">Apache License, Version 3832.0</a> or <a href="LICENSE-MIT">MIT license</a> at your option. 384</sup> 385 386<br> 387 388<sub> 389Unless you explicitly state otherwise, any contribution intentionally submitted 390for inclusion in this crate by you, as defined in the Apache-2.0 license, shall 391be dual licensed as above, without any additional terms or conditions. 392</sub> 393