serde_json_borrow/
ser.rs

1use serde::ser::{Serialize, Serializer};
2
3use crate::owned::OwnedValue;
4use crate::value::{Number, Value, N};
5use crate::Map;
6
7impl Serialize for Value<'_> {
8    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
9    where S: Serializer {
10        match self {
11            Value::Null => serializer.serialize_unit(),
12            Value::Bool(b) => serializer.serialize_bool(*b),
13            Value::Number(n) => n.serialize(serializer),
14            Value::Str(s) => serializer.serialize_str(s),
15            Value::Array(v) => serializer.collect_seq(v),
16            Value::Object(m) => m.serialize(serializer),
17        }
18    }
19}
20impl Serialize for Map<'_> {
21    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
22    where S: Serializer {
23        serializer.collect_map(self.iter())
24    }
25}
26
27impl Serialize for OwnedValue {
28    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
29    where S: Serializer {
30        Value::serialize(self.get_value(), serializer)
31    }
32}
33
34impl Serialize for Number {
35    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
36    where S: Serializer {
37        match self.n {
38            N::PosInt(n) => serializer.serialize_u64(n),
39            N::NegInt(n) => serializer.serialize_i64(n),
40            N::Float(n) => serializer.serialize_f64(n),
41        }
42    }
43}
44
45#[cfg(test)]
46mod tests {
47
48    #[test]
49    fn serialize_json_test() {
50        let json_obj =
51            r#"{"bool":true,"string_key":"string_val","float":1.23,"i64":-123,"u64":123}"#;
52
53        let val1: crate::Value = serde_json::from_str(json_obj).unwrap();
54        let deser1: String = serde_json::to_string(&val1).unwrap();
55        assert_eq!(deser1, json_obj);
56    }
57}