jsonc_parser/
serde.rs

1use super::CollectOptions;
2use super::ParseOptions;
3use super::errors::ParseError;
4use super::parse_to_ast;
5
6/// Parses a string containing JSONC to a `serde_json::Value`.
7///
8/// Requires the "serde" cargo feature:
9///
10/// ```toml
11/// jsonc-parser = { version = "...", features = ["serde"] }
12/// ```
13///
14/// # Example
15///
16/// ```rs
17/// use jsonc_parser::parse_to_serde_value;
18///
19/// let json_value = parse_to_serde_value(
20///   r#"{ "test": 5 } // test"#,
21///   &Default::default(),
22/// ).unwrap();
23/// ```
24pub fn parse_to_serde_value(text: &str, parse_options: &ParseOptions) -> Result<Option<serde_json::Value>, ParseError> {
25  let value = parse_to_ast(
26    text,
27    &CollectOptions {
28      comments: crate::CommentCollectionStrategy::Off,
29      tokens: false,
30    },
31    parse_options,
32  )?
33  .value;
34  Ok(value.map(|v| v.into()))
35}
36
37#[cfg(test)]
38mod tests {
39  use pretty_assertions::assert_eq;
40  use serde_json::Value as SerdeValue;
41  use std::str::FromStr;
42
43  use super::*;
44
45  #[test]
46  fn it_should_error_when_has_error() {
47    assert_has_error(
48      "[][]",
49      "Text cannot contain more than one JSON value on line 1 column 3",
50    );
51  }
52
53  fn assert_has_error(text: &str, message: &str) {
54    let result = parse_to_serde_value(text, &Default::default());
55    match result {
56      Ok(_) => panic!("Expected error, but did not find one."),
57      Err(err) => assert_eq!(err.to_string(), message),
58    }
59  }
60
61  #[test]
62  fn it_should_parse_to_serde_value() {
63    let result = parse_to_serde_value(
64      r#"{ "a": { "a1": 5 }, "b": [0.3e+025], "c": "c1", "d": true, "e": false, "f": null }"#,
65      &Default::default(),
66    )
67    .unwrap();
68
69    let mut expected_value = serde_json::map::Map::new();
70    expected_value.insert("a".to_string(), {
71      let mut inner_obj = serde_json::map::Map::new();
72      inner_obj.insert(
73        "a1".to_string(),
74        SerdeValue::Number(serde_json::Number::from_str("5").unwrap()),
75      );
76      SerdeValue::Object(inner_obj)
77    });
78    expected_value.insert("b".to_string(), {
79      let mut inner_array = Vec::new();
80      inner_array.push(SerdeValue::Number(serde_json::Number::from_str("0.3e+025").unwrap()));
81      SerdeValue::Array(inner_array)
82    });
83    expected_value.insert("c".to_string(), SerdeValue::String("c1".to_string()));
84    expected_value.insert("d".to_string(), SerdeValue::Bool(true));
85    expected_value.insert("e".to_string(), SerdeValue::Bool(false));
86    expected_value.insert("f".to_string(), SerdeValue::Null);
87
88    assert_eq!(result, Some(SerdeValue::Object(expected_value)));
89  }
90
91  #[test]
92  fn it_should_parse_hexadecimal_numbers_to_decimal() {
93    let result = parse_to_serde_value(
94      r#"{
95        "hex1": 0x7DF,
96        "hex2": 0xFF,
97        "hex3": 0x10
98      }"#,
99      &Default::default(),
100    )
101    .unwrap();
102
103    let mut expected_value = serde_json::map::Map::new();
104    expected_value.insert("hex1".to_string(), SerdeValue::Number(serde_json::Number::from(2015)));
105    expected_value.insert("hex2".to_string(), SerdeValue::Number(serde_json::Number::from(255)));
106    expected_value.insert("hex3".to_string(), SerdeValue::Number(serde_json::Number::from(16)));
107
108    assert_eq!(result, Some(SerdeValue::Object(expected_value)));
109  }
110
111  #[test]
112  fn it_should_parse_unary_plus_numbers() {
113    let result = parse_to_serde_value(
114      r#"{
115        "pos1": +42,
116        "pos2": +0.5,
117        "pos3": +1e10
118      }"#,
119      &Default::default(),
120    )
121    .unwrap();
122
123    let mut expected_value = serde_json::map::Map::new();
124    expected_value.insert("pos1".to_string(), SerdeValue::Number(serde_json::Number::from(42)));
125    expected_value.insert(
126      "pos2".to_string(),
127      SerdeValue::Number(serde_json::Number::from_str("0.5").unwrap()),
128    );
129    expected_value.insert(
130      "pos3".to_string(),
131      SerdeValue::Number(serde_json::Number::from_str("1e10").unwrap()),
132    );
133
134    assert_eq!(result, Some(SerdeValue::Object(expected_value)));
135  }
136}