jsonc_parser/
serde.rs

1use super::errors::ParseError;
2use super::parse_to_ast;
3use super::CollectOptions;
4use super::ParseOptions;
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(r#"{ "test": 5 } // test"#, &Default::default()).unwrap();
20/// ```
21pub fn parse_to_serde_value(text: &str, parse_options: &ParseOptions) -> Result<Option<serde_json::Value>, ParseError> {
22  let value = parse_to_ast(
23    text,
24    &CollectOptions {
25      comments: crate::CommentCollectionStrategy::Off,
26      tokens: false,
27    },
28    parse_options,
29  )?
30  .value;
31  Ok(value.map(|v| v.into()))
32}
33
34#[cfg(test)]
35mod tests {
36  use pretty_assertions::assert_eq;
37  use serde_json::Value as SerdeValue;
38  use std::str::FromStr;
39
40  use super::*;
41
42  #[test]
43  fn it_should_error_when_has_error() {
44    assert_has_error(
45      "[][]",
46      "Text cannot contain more than one JSON value on line 1 column 3",
47    );
48  }
49
50  fn assert_has_error(text: &str, message: &str) {
51    let result = parse_to_serde_value(text, &Default::default());
52    match result {
53      Ok(_) => panic!("Expected error, but did not find one."),
54      Err(err) => assert_eq!(err.to_string(), message),
55    }
56  }
57
58  #[test]
59  fn it_should_parse_to_serde_value() {
60    let result = parse_to_serde_value(
61      r#"{ "a": { "a1": 5 }, "b": [0.3e+025], "c": "c1", "d": true, "e": false, "f": null }"#,
62      &Default::default(),
63    )
64    .unwrap();
65
66    let mut expected_value = serde_json::map::Map::new();
67    expected_value.insert("a".to_string(), {
68      let mut inner_obj = serde_json::map::Map::new();
69      inner_obj.insert(
70        "a1".to_string(),
71        SerdeValue::Number(serde_json::Number::from_str("5").unwrap()),
72      );
73      SerdeValue::Object(inner_obj)
74    });
75    expected_value.insert("b".to_string(), {
76      let mut inner_array = Vec::new();
77      inner_array.push(SerdeValue::Number(serde_json::Number::from_str("0.3e+025").unwrap()));
78      SerdeValue::Array(inner_array)
79    });
80    expected_value.insert("c".to_string(), SerdeValue::String("c1".to_string()));
81    expected_value.insert("d".to_string(), SerdeValue::Bool(true));
82    expected_value.insert("e".to_string(), SerdeValue::Bool(false));
83    expected_value.insert("f".to_string(), SerdeValue::Null);
84
85    assert_eq!(result, Some(SerdeValue::Object(expected_value)));
86  }
87}