json_syntax/convert/
serde_json.rs

1use crate::{object::Entry, Value};
2
3impl Value {
4	/// Converts a [`serde_json::Value`] into a `Value`.
5	///
6	/// # Example
7	///
8	/// ```
9	/// // First we create a `serde_json` value.
10	/// let a = serde_json::json!({
11	///   "foo": 1,
12	///   "bar": [2, 3]
13	/// });
14	///
15	/// // We convert the `serde_json` value into a `json_syntax` value.
16	/// let b = json_syntax::Value::from_serde_json(a);
17	///
18	/// // We convert it back into a `serde_json` value.
19	/// let _ = json_syntax::Value::into_serde_json(b);
20	/// ```
21	pub fn from_serde_json(value: serde_json::Value) -> Self {
22		match value {
23			serde_json::Value::Null => Self::Null,
24			serde_json::Value::Bool(b) => Self::Boolean(b),
25			serde_json::Value::Number(n) => Self::Number(n.into()),
26			serde_json::Value::String(s) => Self::String(s.into()),
27			serde_json::Value::Array(a) => {
28				Self::Array(a.into_iter().map(Self::from_serde_json).collect())
29			}
30			serde_json::Value::Object(o) => Self::Object(
31				o.into_iter()
32					.map(|(k, v)| Entry::new(k.into(), Self::from_serde_json(v)))
33					.collect(),
34			),
35		}
36	}
37
38	/// Converts a `Value` into a [`serde_json::Value`].
39	///
40	/// # Example
41	///
42	/// ```
43	/// // First we create a `serde_json` value.
44	/// let a = serde_json::json!({
45	///   "foo": 1,
46	///   "bar": [2, 3]
47	/// });
48	///
49	/// // We convert the `serde_json` value into a `json_syntax` value.
50	/// let b = json_syntax::Value::from_serde_json(a);
51	///
52	/// // We convert it back into a `serde_json` value.
53	/// let _ = json_syntax::Value::into_serde_json(b);
54	/// ```
55	pub fn into_serde_json(self) -> serde_json::Value {
56		match self {
57			Self::Null => serde_json::Value::Null,
58			Self::Boolean(b) => serde_json::Value::Bool(b),
59			Self::Number(n) => serde_json::Value::Number(n.into()),
60			Self::String(s) => serde_json::Value::String(s.into_string()),
61			Self::Array(a) => {
62				serde_json::Value::Array(a.into_iter().map(Value::into_serde_json).collect())
63			}
64			Self::Object(o) => serde_json::Value::Object(
65				o.into_iter()
66					.map(|Entry { key, value }| (key.into_string(), Value::into_serde_json(value)))
67					.collect(),
68			),
69		}
70	}
71}
72
73impl From<serde_json::Value> for Value {
74	#[inline(always)]
75	fn from(value: serde_json::Value) -> Self {
76		Self::from_serde_json(value)
77	}
78}
79
80impl From<Value> for serde_json::Value {
81	fn from(value: Value) -> Self {
82		value.into_serde_json()
83	}
84}