1 //! The Value enum, a loosely typed way of representing any valid JSON value.
2 //!
3 //! # Constructing JSON
4 //!
5 //! Serde JSON provides a [`json!` macro][macro] to build `serde_json::Value`
6 //! objects with very natural JSON syntax.
7 //!
8 //! ```
9 //! use serde_json::json;
10 //!
11 //! fn main() {
12 //! // The type of `john` is `serde_json::Value`
13 //! let john = json!({
14 //! "name": "John Doe",
15 //! "age": 43,
16 //! "phones": [
17 //! "+44 1234567",
18 //! "+44 2345678"
19 //! ]
20 //! });
21 //!
22 //! println!("first phone number: {}", john["phones"][0]);
23 //!
24 //! // Convert to a string of JSON and print it out
25 //! println!("{}", john.to_string());
26 //! }
27 //! ```
28 //!
29 //! The `Value::to_string()` function converts a `serde_json::Value` into a
30 //! `String` of JSON text.
31 //!
32 //! One neat thing about the `json!` macro is that variables and expressions can
33 //! be interpolated directly into the JSON value as you are building it. Serde
34 //! will check at compile time that the value you are interpolating is able to
35 //! be represented as JSON.
36 //!
37 //! ```
38 //! # use serde_json::json;
39 //! #
40 //! # fn random_phone() -> u16 { 0 }
41 //! #
42 //! let full_name = "John Doe";
43 //! let age_last_year = 42;
44 //!
45 //! // The type of `john` is `serde_json::Value`
46 //! let john = json!({
47 //! "name": full_name,
48 //! "age": age_last_year + 1,
49 //! "phones": [
50 //! format!("+44 {}", random_phone())
51 //! ]
52 //! });
53 //! ```
54 //!
55 //! A string of JSON data can be parsed into a `serde_json::Value` by the
56 //! [`serde_json::from_str`][from_str] function. There is also
57 //! [`from_slice`][from_slice] for parsing from a byte slice `&[u8]` and
58 //! [`from_reader`][from_reader] for parsing from any `io::Read` like a File or
59 //! a TCP stream.
60 //!
61 //! ```
62 //! use serde_json::{json, Value, Error};
63 //!
64 //! fn untyped_example() -> Result<(), Error> {
65 //! // Some JSON input data as a &str. Maybe this comes from the user.
66 //! let data = r#"
67 //! {
68 //! "name": "John Doe",
69 //! "age": 43,
70 //! "phones": [
71 //! "+44 1234567",
72 //! "+44 2345678"
73 //! ]
74 //! }"#;
75 //!
76 //! // Parse the string of data into serde_json::Value.
77 //! let v: Value = serde_json::from_str(data)?;
78 //!
79 //! // Access parts of the data by indexing with square brackets.
80 //! println!("Please call {} at the number {}", v["name"], v["phones"][0]);
81 //!
82 //! Ok(())
83 //! }
84 //! #
85 //! # untyped_example().unwrap();
86 //! ```
87 //!
88 //! [macro]: crate::json
89 //! [from_str]: crate::de::from_str
90 //! [from_slice]: crate::de::from_slice
91 //! [from_reader]: crate::de::from_reader
92
93 use crate::error::Error;
94 use crate::io;
95 use alloc::string::String;
96 use alloc::vec::Vec;
97 use core::fmt::{self, Debug, Display};
98 use core::mem;
99 use core::str;
100 use serde::de::DeserializeOwned;
101 use serde::ser::Serialize;
102
103 pub use self::index::Index;
104 pub use self::ser::Serializer;
105 pub use crate::map::Map;
106 pub use crate::number::Number;
107
108 #[cfg(feature = "raw_value")]
109 pub use crate::raw::{to_raw_value, RawValue};
110
111 /// Represents any valid JSON value.
112 ///
113 /// See the [`serde_json::value` module documentation](self) for usage examples.
114 #[derive(Clone, Eq, PartialEq)]
115 pub enum Value {
116 /// Represents a JSON null value.
117 ///
118 /// ```
119 /// # use serde_json::json;
120 /// #
121 /// let v = json!(null);
122 /// ```
123 Null,
124
125 /// Represents a JSON boolean.
126 ///
127 /// ```
128 /// # use serde_json::json;
129 /// #
130 /// let v = json!(true);
131 /// ```
132 Bool(bool),
133
134 /// Represents a JSON number, whether integer or floating point.
135 ///
136 /// ```
137 /// # use serde_json::json;
138 /// #
139 /// let v = json!(12.5);
140 /// ```
141 Number(Number),
142
143 /// Represents a JSON string.
144 ///
145 /// ```
146 /// # use serde_json::json;
147 /// #
148 /// let v = json!("a string");
149 /// ```
150 String(String),
151
152 /// Represents a JSON array.
153 ///
154 /// ```
155 /// # use serde_json::json;
156 /// #
157 /// let v = json!(["an", "array"]);
158 /// ```
159 Array(Vec<Value>),
160
161 /// Represents a JSON object.
162 ///
163 /// By default the map is backed by a BTreeMap. Enable the `preserve_order`
164 /// feature of serde_json to use IndexMap instead, which preserves
165 /// entries in the order they are inserted into the map. In particular, this
166 /// allows JSON data to be deserialized into a Value and serialized to a
167 /// string while retaining the order of map keys in the input.
168 ///
169 /// ```
170 /// # use serde_json::json;
171 /// #
172 /// let v = json!({ "an": "object" });
173 /// ```
174 Object(Map<String, Value>),
175 }
176
177 impl Debug for Value {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result178 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
179 match self {
180 Value::Null => formatter.write_str("Null"),
181 Value::Bool(boolean) => write!(formatter, "Bool({})", boolean),
182 Value::Number(number) => Debug::fmt(number, formatter),
183 Value::String(string) => write!(formatter, "String({:?})", string),
184 Value::Array(vec) => {
185 formatter.write_str("Array ")?;
186 Debug::fmt(vec, formatter)
187 }
188 Value::Object(map) => {
189 formatter.write_str("Object ")?;
190 Debug::fmt(map, formatter)
191 }
192 }
193 }
194 }
195
196 impl Display for Value {
197 /// Display a JSON value as a string.
198 ///
199 /// ```
200 /// # use serde_json::json;
201 /// #
202 /// let json = json!({ "city": "London", "street": "10 Downing Street" });
203 ///
204 /// // Compact format:
205 /// //
206 /// // {"city":"London","street":"10 Downing Street"}
207 /// let compact = format!("{}", json);
208 /// assert_eq!(compact,
209 /// "{\"city\":\"London\",\"street\":\"10 Downing Street\"}");
210 ///
211 /// // Pretty format:
212 /// //
213 /// // {
214 /// // "city": "London",
215 /// // "street": "10 Downing Street"
216 /// // }
217 /// let pretty = format!("{:#}", json);
218 /// assert_eq!(pretty,
219 /// "{\n \"city\": \"London\",\n \"street\": \"10 Downing Street\"\n}");
220 /// ```
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result221 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
222 struct WriterFormatter<'a, 'b: 'a> {
223 inner: &'a mut fmt::Formatter<'b>,
224 }
225
226 impl<'a, 'b> io::Write for WriterFormatter<'a, 'b> {
227 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
228 // Safety: the serializer below only emits valid utf8 when using
229 // the default formatter.
230 let s = unsafe { str::from_utf8_unchecked(buf) };
231 tri!(self.inner.write_str(s).map_err(io_error));
232 Ok(buf.len())
233 }
234
235 fn flush(&mut self) -> io::Result<()> {
236 Ok(())
237 }
238 }
239
240 fn io_error(_: fmt::Error) -> io::Error {
241 // Error value does not matter because Display impl just maps it
242 // back to fmt::Error.
243 io::Error::new(io::ErrorKind::Other, "fmt error")
244 }
245
246 let alternate = f.alternate();
247 let mut wr = WriterFormatter { inner: f };
248 if alternate {
249 // {:#}
250 super::ser::to_writer_pretty(&mut wr, self).map_err(|_| fmt::Error)
251 } else {
252 // {}
253 super::ser::to_writer(&mut wr, self).map_err(|_| fmt::Error)
254 }
255 }
256 }
257
parse_index(s: &str) -> Option<usize>258 fn parse_index(s: &str) -> Option<usize> {
259 if s.starts_with('+') || (s.starts_with('0') && s.len() != 1) {
260 return None;
261 }
262 s.parse().ok()
263 }
264
265 impl Value {
266 /// Index into a JSON array or map. A string index can be used to access a
267 /// value in a map, and a usize index can be used to access an element of an
268 /// array.
269 ///
270 /// Returns `None` if the type of `self` does not match the type of the
271 /// index, for example if the index is a string and `self` is an array or a
272 /// number. Also returns `None` if the given key does not exist in the map
273 /// or the given index is not within the bounds of the array.
274 ///
275 /// ```
276 /// # use serde_json::json;
277 /// #
278 /// let object = json!({ "A": 65, "B": 66, "C": 67 });
279 /// assert_eq!(*object.get("A").unwrap(), json!(65));
280 ///
281 /// let array = json!([ "A", "B", "C" ]);
282 /// assert_eq!(*array.get(2).unwrap(), json!("C"));
283 ///
284 /// assert_eq!(array.get("A"), None);
285 /// ```
286 ///
287 /// Square brackets can also be used to index into a value in a more concise
288 /// way. This returns `Value::Null` in cases where `get` would have returned
289 /// `None`.
290 ///
291 /// ```
292 /// # use serde_json::json;
293 /// #
294 /// let object = json!({
295 /// "A": ["a", "á", "à"],
296 /// "B": ["b", "b́"],
297 /// "C": ["c", "ć", "ć̣", "ḉ"],
298 /// });
299 /// assert_eq!(object["B"][0], json!("b"));
300 ///
301 /// assert_eq!(object["D"], json!(null));
302 /// assert_eq!(object[0]["x"]["y"]["z"], json!(null));
303 /// ```
get<I: Index>(&self, index: I) -> Option<&Value>304 pub fn get<I: Index>(&self, index: I) -> Option<&Value> {
305 index.index_into(self)
306 }
307
308 /// Mutably index into a JSON array or map. A string index can be used to
309 /// access a value in a map, and a usize index can be used to access an
310 /// element of an array.
311 ///
312 /// Returns `None` if the type of `self` does not match the type of the
313 /// index, for example if the index is a string and `self` is an array or a
314 /// number. Also returns `None` if the given key does not exist in the map
315 /// or the given index is not within the bounds of the array.
316 ///
317 /// ```
318 /// # use serde_json::json;
319 /// #
320 /// let mut object = json!({ "A": 65, "B": 66, "C": 67 });
321 /// *object.get_mut("A").unwrap() = json!(69);
322 ///
323 /// let mut array = json!([ "A", "B", "C" ]);
324 /// *array.get_mut(2).unwrap() = json!("D");
325 /// ```
get_mut<I: Index>(&mut self, index: I) -> Option<&mut Value>326 pub fn get_mut<I: Index>(&mut self, index: I) -> Option<&mut Value> {
327 index.index_into_mut(self)
328 }
329
330 /// Returns true if the `Value` is an Object. Returns false otherwise.
331 ///
332 /// For any Value on which `is_object` returns true, `as_object` and
333 /// `as_object_mut` are guaranteed to return the map representation of the
334 /// object.
335 ///
336 /// ```
337 /// # use serde_json::json;
338 /// #
339 /// let obj = json!({ "a": { "nested": true }, "b": ["an", "array"] });
340 ///
341 /// assert!(obj.is_object());
342 /// assert!(obj["a"].is_object());
343 ///
344 /// // array, not an object
345 /// assert!(!obj["b"].is_object());
346 /// ```
is_object(&self) -> bool347 pub fn is_object(&self) -> bool {
348 self.as_object().is_some()
349 }
350
351 /// If the `Value` is an Object, returns the associated Map. Returns None
352 /// otherwise.
353 ///
354 /// ```
355 /// # use serde_json::json;
356 /// #
357 /// let v = json!({ "a": { "nested": true }, "b": ["an", "array"] });
358 ///
359 /// // The length of `{"nested": true}` is 1 entry.
360 /// assert_eq!(v["a"].as_object().unwrap().len(), 1);
361 ///
362 /// // The array `["an", "array"]` is not an object.
363 /// assert_eq!(v["b"].as_object(), None);
364 /// ```
as_object(&self) -> Option<&Map<String, Value>>365 pub fn as_object(&self) -> Option<&Map<String, Value>> {
366 match self {
367 Value::Object(map) => Some(map),
368 _ => None,
369 }
370 }
371
372 /// If the `Value` is an Object, returns the associated mutable Map.
373 /// Returns None otherwise.
374 ///
375 /// ```
376 /// # use serde_json::json;
377 /// #
378 /// let mut v = json!({ "a": { "nested": true } });
379 ///
380 /// v["a"].as_object_mut().unwrap().clear();
381 /// assert_eq!(v, json!({ "a": {} }));
382 /// ```
as_object_mut(&mut self) -> Option<&mut Map<String, Value>>383 pub fn as_object_mut(&mut self) -> Option<&mut Map<String, Value>> {
384 match self {
385 Value::Object(map) => Some(map),
386 _ => None,
387 }
388 }
389
390 /// Returns true if the `Value` is an Array. Returns false otherwise.
391 ///
392 /// For any Value on which `is_array` returns true, `as_array` and
393 /// `as_array_mut` are guaranteed to return the vector representing the
394 /// array.
395 ///
396 /// ```
397 /// # use serde_json::json;
398 /// #
399 /// let obj = json!({ "a": ["an", "array"], "b": { "an": "object" } });
400 ///
401 /// assert!(obj["a"].is_array());
402 ///
403 /// // an object, not an array
404 /// assert!(!obj["b"].is_array());
405 /// ```
is_array(&self) -> bool406 pub fn is_array(&self) -> bool {
407 self.as_array().is_some()
408 }
409
410 /// If the `Value` is an Array, returns the associated vector. Returns None
411 /// otherwise.
412 ///
413 /// ```
414 /// # use serde_json::json;
415 /// #
416 /// let v = json!({ "a": ["an", "array"], "b": { "an": "object" } });
417 ///
418 /// // The length of `["an", "array"]` is 2 elements.
419 /// assert_eq!(v["a"].as_array().unwrap().len(), 2);
420 ///
421 /// // The object `{"an": "object"}` is not an array.
422 /// assert_eq!(v["b"].as_array(), None);
423 /// ```
as_array(&self) -> Option<&Vec<Value>>424 pub fn as_array(&self) -> Option<&Vec<Value>> {
425 match self {
426 Value::Array(array) => Some(array),
427 _ => None,
428 }
429 }
430
431 /// If the `Value` is an Array, returns the associated mutable vector.
432 /// Returns None otherwise.
433 ///
434 /// ```
435 /// # use serde_json::json;
436 /// #
437 /// let mut v = json!({ "a": ["an", "array"] });
438 ///
439 /// v["a"].as_array_mut().unwrap().clear();
440 /// assert_eq!(v, json!({ "a": [] }));
441 /// ```
as_array_mut(&mut self) -> Option<&mut Vec<Value>>442 pub fn as_array_mut(&mut self) -> Option<&mut Vec<Value>> {
443 match self {
444 Value::Array(list) => Some(list),
445 _ => None,
446 }
447 }
448
449 /// Returns true if the `Value` is a String. Returns false otherwise.
450 ///
451 /// For any Value on which `is_string` returns true, `as_str` is guaranteed
452 /// to return the string slice.
453 ///
454 /// ```
455 /// # use serde_json::json;
456 /// #
457 /// let v = json!({ "a": "some string", "b": false });
458 ///
459 /// assert!(v["a"].is_string());
460 ///
461 /// // The boolean `false` is not a string.
462 /// assert!(!v["b"].is_string());
463 /// ```
is_string(&self) -> bool464 pub fn is_string(&self) -> bool {
465 self.as_str().is_some()
466 }
467
468 /// If the `Value` is a String, returns the associated str. Returns None
469 /// otherwise.
470 ///
471 /// ```
472 /// # use serde_json::json;
473 /// #
474 /// let v = json!({ "a": "some string", "b": false });
475 ///
476 /// assert_eq!(v["a"].as_str(), Some("some string"));
477 ///
478 /// // The boolean `false` is not a string.
479 /// assert_eq!(v["b"].as_str(), None);
480 ///
481 /// // JSON values are printed in JSON representation, so strings are in quotes.
482 /// //
483 /// // The value is: "some string"
484 /// println!("The value is: {}", v["a"]);
485 ///
486 /// // Rust strings are printed without quotes.
487 /// //
488 /// // The value is: some string
489 /// println!("The value is: {}", v["a"].as_str().unwrap());
490 /// ```
as_str(&self) -> Option<&str>491 pub fn as_str(&self) -> Option<&str> {
492 match self {
493 Value::String(s) => Some(s),
494 _ => None,
495 }
496 }
497
498 /// Returns true if the `Value` is a Number. Returns false otherwise.
499 ///
500 /// ```
501 /// # use serde_json::json;
502 /// #
503 /// let v = json!({ "a": 1, "b": "2" });
504 ///
505 /// assert!(v["a"].is_number());
506 ///
507 /// // The string `"2"` is a string, not a number.
508 /// assert!(!v["b"].is_number());
509 /// ```
is_number(&self) -> bool510 pub fn is_number(&self) -> bool {
511 match *self {
512 Value::Number(_) => true,
513 _ => false,
514 }
515 }
516
517 /// Returns true if the `Value` is an integer between `i64::MIN` and
518 /// `i64::MAX`.
519 ///
520 /// For any Value on which `is_i64` returns true, `as_i64` is guaranteed to
521 /// return the integer value.
522 ///
523 /// ```
524 /// # use serde_json::json;
525 /// #
526 /// let big = i64::max_value() as u64 + 10;
527 /// let v = json!({ "a": 64, "b": big, "c": 256.0 });
528 ///
529 /// assert!(v["a"].is_i64());
530 ///
531 /// // Greater than i64::MAX.
532 /// assert!(!v["b"].is_i64());
533 ///
534 /// // Numbers with a decimal point are not considered integers.
535 /// assert!(!v["c"].is_i64());
536 /// ```
is_i64(&self) -> bool537 pub fn is_i64(&self) -> bool {
538 match self {
539 Value::Number(n) => n.is_i64(),
540 _ => false,
541 }
542 }
543
544 /// Returns true if the `Value` is an integer between zero and `u64::MAX`.
545 ///
546 /// For any Value on which `is_u64` returns true, `as_u64` is guaranteed to
547 /// return the integer value.
548 ///
549 /// ```
550 /// # use serde_json::json;
551 /// #
552 /// let v = json!({ "a": 64, "b": -64, "c": 256.0 });
553 ///
554 /// assert!(v["a"].is_u64());
555 ///
556 /// // Negative integer.
557 /// assert!(!v["b"].is_u64());
558 ///
559 /// // Numbers with a decimal point are not considered integers.
560 /// assert!(!v["c"].is_u64());
561 /// ```
is_u64(&self) -> bool562 pub fn is_u64(&self) -> bool {
563 match self {
564 Value::Number(n) => n.is_u64(),
565 _ => false,
566 }
567 }
568
569 /// Returns true if the `Value` is a number that can be represented by f64.
570 ///
571 /// For any Value on which `is_f64` returns true, `as_f64` is guaranteed to
572 /// return the floating point value.
573 ///
574 /// Currently this function returns true if and only if both `is_i64` and
575 /// `is_u64` return false but this is not a guarantee in the future.
576 ///
577 /// ```
578 /// # use serde_json::json;
579 /// #
580 /// let v = json!({ "a": 256.0, "b": 64, "c": -64 });
581 ///
582 /// assert!(v["a"].is_f64());
583 ///
584 /// // Integers.
585 /// assert!(!v["b"].is_f64());
586 /// assert!(!v["c"].is_f64());
587 /// ```
is_f64(&self) -> bool588 pub fn is_f64(&self) -> bool {
589 match self {
590 Value::Number(n) => n.is_f64(),
591 _ => false,
592 }
593 }
594
595 /// If the `Value` is an integer, represent it as i64 if possible. Returns
596 /// None otherwise.
597 ///
598 /// ```
599 /// # use serde_json::json;
600 /// #
601 /// let big = i64::max_value() as u64 + 10;
602 /// let v = json!({ "a": 64, "b": big, "c": 256.0 });
603 ///
604 /// assert_eq!(v["a"].as_i64(), Some(64));
605 /// assert_eq!(v["b"].as_i64(), None);
606 /// assert_eq!(v["c"].as_i64(), None);
607 /// ```
as_i64(&self) -> Option<i64>608 pub fn as_i64(&self) -> Option<i64> {
609 match self {
610 Value::Number(n) => n.as_i64(),
611 _ => None,
612 }
613 }
614
615 /// If the `Value` is an integer, represent it as u64 if possible. Returns
616 /// None otherwise.
617 ///
618 /// ```
619 /// # use serde_json::json;
620 /// #
621 /// let v = json!({ "a": 64, "b": -64, "c": 256.0 });
622 ///
623 /// assert_eq!(v["a"].as_u64(), Some(64));
624 /// assert_eq!(v["b"].as_u64(), None);
625 /// assert_eq!(v["c"].as_u64(), None);
626 /// ```
as_u64(&self) -> Option<u64>627 pub fn as_u64(&self) -> Option<u64> {
628 match self {
629 Value::Number(n) => n.as_u64(),
630 _ => None,
631 }
632 }
633
634 /// If the `Value` is a number, represent it as f64 if possible. Returns
635 /// None otherwise.
636 ///
637 /// ```
638 /// # use serde_json::json;
639 /// #
640 /// let v = json!({ "a": 256.0, "b": 64, "c": -64 });
641 ///
642 /// assert_eq!(v["a"].as_f64(), Some(256.0));
643 /// assert_eq!(v["b"].as_f64(), Some(64.0));
644 /// assert_eq!(v["c"].as_f64(), Some(-64.0));
645 /// ```
as_f64(&self) -> Option<f64>646 pub fn as_f64(&self) -> Option<f64> {
647 match self {
648 Value::Number(n) => n.as_f64(),
649 _ => None,
650 }
651 }
652
653 /// Returns true if the `Value` is a Boolean. Returns false otherwise.
654 ///
655 /// For any Value on which `is_boolean` returns true, `as_bool` is
656 /// guaranteed to return the boolean value.
657 ///
658 /// ```
659 /// # use serde_json::json;
660 /// #
661 /// let v = json!({ "a": false, "b": "false" });
662 ///
663 /// assert!(v["a"].is_boolean());
664 ///
665 /// // The string `"false"` is a string, not a boolean.
666 /// assert!(!v["b"].is_boolean());
667 /// ```
is_boolean(&self) -> bool668 pub fn is_boolean(&self) -> bool {
669 self.as_bool().is_some()
670 }
671
672 /// If the `Value` is a Boolean, returns the associated bool. Returns None
673 /// otherwise.
674 ///
675 /// ```
676 /// # use serde_json::json;
677 /// #
678 /// let v = json!({ "a": false, "b": "false" });
679 ///
680 /// assert_eq!(v["a"].as_bool(), Some(false));
681 ///
682 /// // The string `"false"` is a string, not a boolean.
683 /// assert_eq!(v["b"].as_bool(), None);
684 /// ```
as_bool(&self) -> Option<bool>685 pub fn as_bool(&self) -> Option<bool> {
686 match *self {
687 Value::Bool(b) => Some(b),
688 _ => None,
689 }
690 }
691
692 /// Returns true if the `Value` is a Null. Returns false otherwise.
693 ///
694 /// For any Value on which `is_null` returns true, `as_null` is guaranteed
695 /// to return `Some(())`.
696 ///
697 /// ```
698 /// # use serde_json::json;
699 /// #
700 /// let v = json!({ "a": null, "b": false });
701 ///
702 /// assert!(v["a"].is_null());
703 ///
704 /// // The boolean `false` is not null.
705 /// assert!(!v["b"].is_null());
706 /// ```
is_null(&self) -> bool707 pub fn is_null(&self) -> bool {
708 self.as_null().is_some()
709 }
710
711 /// If the `Value` is a Null, returns (). Returns None otherwise.
712 ///
713 /// ```
714 /// # use serde_json::json;
715 /// #
716 /// let v = json!({ "a": null, "b": false });
717 ///
718 /// assert_eq!(v["a"].as_null(), Some(()));
719 ///
720 /// // The boolean `false` is not null.
721 /// assert_eq!(v["b"].as_null(), None);
722 /// ```
as_null(&self) -> Option<()>723 pub fn as_null(&self) -> Option<()> {
724 match *self {
725 Value::Null => Some(()),
726 _ => None,
727 }
728 }
729
730 /// Looks up a value by a JSON Pointer.
731 ///
732 /// JSON Pointer defines a string syntax for identifying a specific value
733 /// within a JavaScript Object Notation (JSON) document.
734 ///
735 /// A Pointer is a Unicode string with the reference tokens separated by `/`.
736 /// Inside tokens `/` is replaced by `~1` and `~` is replaced by `~0`. The
737 /// addressed value is returned and if there is no such value `None` is
738 /// returned.
739 ///
740 /// For more information read [RFC6901](https://tools.ietf.org/html/rfc6901).
741 ///
742 /// # Examples
743 ///
744 /// ```
745 /// # use serde_json::json;
746 /// #
747 /// let data = json!({
748 /// "x": {
749 /// "y": ["z", "zz"]
750 /// }
751 /// });
752 ///
753 /// assert_eq!(data.pointer("/x/y/1").unwrap(), &json!("zz"));
754 /// assert_eq!(data.pointer("/a/b/c"), None);
755 /// ```
pointer(&self, pointer: &str) -> Option<&Value>756 pub fn pointer(&self, pointer: &str) -> Option<&Value> {
757 if pointer.is_empty() {
758 return Some(self);
759 }
760 if !pointer.starts_with('/') {
761 return None;
762 }
763 pointer
764 .split('/')
765 .skip(1)
766 .map(|x| x.replace("~1", "/").replace("~0", "~"))
767 .try_fold(self, |target, token| match target {
768 Value::Object(map) => map.get(&token),
769 Value::Array(list) => parse_index(&token).and_then(|x| list.get(x)),
770 _ => None,
771 })
772 }
773
774 /// Looks up a value by a JSON Pointer and returns a mutable reference to
775 /// that value.
776 ///
777 /// JSON Pointer defines a string syntax for identifying a specific value
778 /// within a JavaScript Object Notation (JSON) document.
779 ///
780 /// A Pointer is a Unicode string with the reference tokens separated by `/`.
781 /// Inside tokens `/` is replaced by `~1` and `~` is replaced by `~0`. The
782 /// addressed value is returned and if there is no such value `None` is
783 /// returned.
784 ///
785 /// For more information read [RFC6901](https://tools.ietf.org/html/rfc6901).
786 ///
787 /// # Example of Use
788 ///
789 /// ```
790 /// use serde_json::Value;
791 ///
792 /// fn main() {
793 /// let s = r#"{"x": 1.0, "y": 2.0}"#;
794 /// let mut value: Value = serde_json::from_str(s).unwrap();
795 ///
796 /// // Check value using read-only pointer
797 /// assert_eq!(value.pointer("/x"), Some(&1.0.into()));
798 /// // Change value with direct assignment
799 /// *value.pointer_mut("/x").unwrap() = 1.5.into();
800 /// // Check that new value was written
801 /// assert_eq!(value.pointer("/x"), Some(&1.5.into()));
802 /// // Or change the value only if it exists
803 /// value.pointer_mut("/x").map(|v| *v = 1.5.into());
804 ///
805 /// // "Steal" ownership of a value. Can replace with any valid Value.
806 /// let old_x = value.pointer_mut("/x").map(Value::take).unwrap();
807 /// assert_eq!(old_x, 1.5);
808 /// assert_eq!(value.pointer("/x").unwrap(), &Value::Null);
809 /// }
810 /// ```
pointer_mut(&mut self, pointer: &str) -> Option<&mut Value>811 pub fn pointer_mut(&mut self, pointer: &str) -> Option<&mut Value> {
812 if pointer.is_empty() {
813 return Some(self);
814 }
815 if !pointer.starts_with('/') {
816 return None;
817 }
818 pointer
819 .split('/')
820 .skip(1)
821 .map(|x| x.replace("~1", "/").replace("~0", "~"))
822 .try_fold(self, |target, token| match target {
823 Value::Object(map) => map.get_mut(&token),
824 Value::Array(list) => parse_index(&token).and_then(move |x| list.get_mut(x)),
825 _ => None,
826 })
827 }
828
829 /// Takes the value out of the `Value`, leaving a `Null` in its place.
830 ///
831 /// ```
832 /// # use serde_json::json;
833 /// #
834 /// let mut v = json!({ "x": "y" });
835 /// assert_eq!(v["x"].take(), json!("y"));
836 /// assert_eq!(v, json!({ "x": null }));
837 /// ```
take(&mut self) -> Value838 pub fn take(&mut self) -> Value {
839 mem::replace(self, Value::Null)
840 }
841 }
842
843 /// The default value is `Value::Null`.
844 ///
845 /// This is useful for handling omitted `Value` fields when deserializing.
846 ///
847 /// # Examples
848 ///
849 /// ```
850 /// # use serde::Deserialize;
851 /// use serde_json::Value;
852 ///
853 /// #[derive(Deserialize)]
854 /// struct Settings {
855 /// level: i32,
856 /// #[serde(default)]
857 /// extras: Value,
858 /// }
859 ///
860 /// # fn try_main() -> Result<(), serde_json::Error> {
861 /// let data = r#" { "level": 42 } "#;
862 /// let s: Settings = serde_json::from_str(data)?;
863 ///
864 /// assert_eq!(s.level, 42);
865 /// assert_eq!(s.extras, Value::Null);
866 /// #
867 /// # Ok(())
868 /// # }
869 /// #
870 /// # try_main().unwrap()
871 /// ```
872 impl Default for Value {
default() -> Value873 fn default() -> Value {
874 Value::Null
875 }
876 }
877
878 mod de;
879 mod from;
880 mod index;
881 mod partial_eq;
882 mod ser;
883
884 /// Convert a `T` into `serde_json::Value` which is an enum that can represent
885 /// any valid JSON data.
886 ///
887 /// # Example
888 ///
889 /// ```
890 /// use serde::Serialize;
891 /// use serde_json::json;
892 ///
893 /// use std::error::Error;
894 ///
895 /// #[derive(Serialize)]
896 /// struct User {
897 /// fingerprint: String,
898 /// location: String,
899 /// }
900 ///
901 /// fn compare_json_values() -> Result<(), Box<Error>> {
902 /// let u = User {
903 /// fingerprint: "0xF9BA143B95FF6D82".to_owned(),
904 /// location: "Menlo Park, CA".to_owned(),
905 /// };
906 ///
907 /// // The type of `expected` is `serde_json::Value`
908 /// let expected = json!({
909 /// "fingerprint": "0xF9BA143B95FF6D82",
910 /// "location": "Menlo Park, CA",
911 /// });
912 ///
913 /// let v = serde_json::to_value(u).unwrap();
914 /// assert_eq!(v, expected);
915 ///
916 /// Ok(())
917 /// }
918 /// #
919 /// # compare_json_values().unwrap();
920 /// ```
921 ///
922 /// # Errors
923 ///
924 /// This conversion can fail if `T`'s implementation of `Serialize` decides to
925 /// fail, or if `T` contains a map with non-string keys.
926 ///
927 /// ```
928 /// use std::collections::BTreeMap;
929 ///
930 /// fn main() {
931 /// // The keys in this map are vectors, not strings.
932 /// let mut map = BTreeMap::new();
933 /// map.insert(vec![32, 64], "x86");
934 ///
935 /// println!("{}", serde_json::to_value(map).unwrap_err());
936 /// }
937 /// ```
938 // Taking by value is more friendly to iterator adapters, option and result
939 // consumers, etc. See https://github.com/serde-rs/json/pull/149.
to_value<T>(value: T) -> Result<Value, Error> where T: Serialize,940 pub fn to_value<T>(value: T) -> Result<Value, Error>
941 where
942 T: Serialize,
943 {
944 value.serialize(Serializer)
945 }
946
947 /// Interpret a `serde_json::Value` as an instance of type `T`.
948 ///
949 /// # Example
950 ///
951 /// ```
952 /// use serde::Deserialize;
953 /// use serde_json::json;
954 ///
955 /// #[derive(Deserialize, Debug)]
956 /// struct User {
957 /// fingerprint: String,
958 /// location: String,
959 /// }
960 ///
961 /// fn main() {
962 /// // The type of `j` is `serde_json::Value`
963 /// let j = json!({
964 /// "fingerprint": "0xF9BA143B95FF6D82",
965 /// "location": "Menlo Park, CA"
966 /// });
967 ///
968 /// let u: User = serde_json::from_value(j).unwrap();
969 /// println!("{:#?}", u);
970 /// }
971 /// ```
972 ///
973 /// # Errors
974 ///
975 /// This conversion can fail if the structure of the Value does not match the
976 /// structure expected by `T`, for example if `T` is a struct type but the Value
977 /// contains something other than a JSON map. It can also fail if the structure
978 /// is correct but `T`'s implementation of `Deserialize` decides that something
979 /// is wrong with the data, for example required struct fields are missing from
980 /// the JSON map or some number is too big to fit in the expected primitive
981 /// type.
from_value<T>(value: Value) -> Result<T, Error> where T: DeserializeOwned,982 pub fn from_value<T>(value: Value) -> Result<T, Error>
983 where
984 T: DeserializeOwned,
985 {
986 T::deserialize(value)
987 }
988