mirror of
https://github.com/nushell/nushell.git
synced 2025-08-10 06:38:43 +02:00
Strict JSON parsing (#11592)
# Description Adds the `--strict` flag for `from json` which will try to parse text while following the exact JSON specification (e.g., no comments or trailing commas allowed). Fixes issue #11548.
This commit is contained in:
@ -43,6 +43,32 @@ fn from_json_text_to_table() {
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn from_json_text_to_table_strict() {
|
||||
Playground::setup("filter_from_json_test_1_strict", |dirs, sandbox| {
|
||||
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
||||
"katz.txt",
|
||||
r#"
|
||||
{
|
||||
"katz": [
|
||||
{"name": "Yehuda", "rusty_luck": 1},
|
||||
{"name": "JT", "rusty_luck": 1},
|
||||
{"name": "Andres", "rusty_luck": 1},
|
||||
{"name":"GorbyPuff", "rusty_luck": 1}
|
||||
]
|
||||
}
|
||||
"#,
|
||||
)]);
|
||||
|
||||
let actual = nu!(
|
||||
cwd: dirs.test(),
|
||||
"open katz.txt | from json -s | get katz | get rusty_luck | length "
|
||||
);
|
||||
|
||||
assert_eq!(actual.out, "4");
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn from_json_text_recognizing_objects_independently_to_table() {
|
||||
Playground::setup("filter_from_json_test_2", |dirs, sandbox| {
|
||||
@ -70,6 +96,33 @@ fn from_json_text_recognizing_objects_independently_to_table() {
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn from_json_text_recognizing_objects_independently_to_table_strict() {
|
||||
Playground::setup("filter_from_json_test_2_strict", |dirs, sandbox| {
|
||||
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
||||
"katz.txt",
|
||||
r#"
|
||||
{"name": "Yehuda", "rusty_luck": 1}
|
||||
{"name": "JT", "rusty_luck": 1}
|
||||
{"name": "Andres", "rusty_luck": 1}
|
||||
{"name":"GorbyPuff", "rusty_luck": 3}
|
||||
"#,
|
||||
)]);
|
||||
|
||||
let actual = nu!(
|
||||
cwd: dirs.test(), pipeline(
|
||||
r#"
|
||||
open katz.txt
|
||||
| from json -o -s
|
||||
| where name == "GorbyPuff"
|
||||
| get rusty_luck.0
|
||||
"#
|
||||
));
|
||||
|
||||
assert_eq!(actual.out, "3");
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn table_to_json_text() {
|
||||
Playground::setup("filter_to_json_test", |dirs, sandbox| {
|
||||
@ -99,6 +152,35 @@ fn table_to_json_text() {
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn table_to_json_text_strict() {
|
||||
Playground::setup("filter_to_json_test_strict", |dirs, sandbox| {
|
||||
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
||||
"sample.txt",
|
||||
r#"
|
||||
JonAndrehudaTZ,3
|
||||
GorbyPuff,100
|
||||
"#,
|
||||
)]);
|
||||
|
||||
let actual = nu!(
|
||||
cwd: dirs.test(), pipeline(
|
||||
r#"
|
||||
open sample.txt
|
||||
| lines
|
||||
| split column "," name luck
|
||||
| select name
|
||||
| to json
|
||||
| from json -s
|
||||
| get 0
|
||||
| get name
|
||||
"#
|
||||
));
|
||||
|
||||
assert_eq!(actual.out, "JonAndrehudaTZ");
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn top_level_values_from_json() {
|
||||
for (value, type_name) in [("null", "nothing"), ("true", "bool"), ("false", "bool")] {
|
||||
@ -109,6 +191,28 @@ fn top_level_values_from_json() {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn top_level_values_from_json_strict() {
|
||||
for (value, type_name) in [("null", "nothing"), ("true", "bool"), ("false", "bool")] {
|
||||
let actual = nu!(r#""{}" | from json -s | to json"#, value);
|
||||
assert_eq!(actual.out, value);
|
||||
let actual = nu!(r#""{}" | from json -s | describe"#, value);
|
||||
assert_eq!(actual.out, type_name);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn strict_parsing_fails_on_comment() {
|
||||
let actual = nu!(r#"'{ "a": 1, /* comment */ "b": 2 }' | from json -s"#);
|
||||
assert!(actual.err.contains("error parsing JSON text"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn strict_parsing_fails_on_trailing_comma() {
|
||||
let actual = nu!(r#"'{ "a": 1, "b": 2, }' | from json -s"#);
|
||||
assert!(actual.err.contains("error parsing JSON text"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ranges_to_json_as_array() {
|
||||
let value = r#"[ 1, 2, 3]"#;
|
||||
|
Reference in New Issue
Block a user