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