use json_streaming::blocking::*;
use json_streaming::shared::*;
use std::io;
use std::io::Cursor;
fn main() {
skip_unexpected_keys_in_object().unwrap();
println!("--");
skip_unexpected_keys_in_array().unwrap();
}
fn skip_unexpected_keys_in_object() -> JsonParseResult<(), io::Error> {
let json = r#"
{
"a": true,
"unexpected_string": "abc",
"unexpected_array": [ 1, 2, { "xyz": "yo" }, 4, [ 4, 5, 6], 4],
"unexpected_object": { "x": null, "y": [1, 2, 3, {}], "z": {"a": [1, 2, 2] } },
"b": 3
}
"#;
let mut r = Cursor::new(json.as_bytes());
let mut json_reader = JsonReader::new(1024, &mut r);
json_reader.expect_start_object()?;
loop {
match json_reader.expect_key()? {
Some("a") => println!("a: {}", json_reader.expect_bool()?),
Some("b") => println!("b: {}", json_reader.expect_number::<u32>()?),
Some(other) => {
println!("unexpected key {}, skipping", other);
json_reader.skip_value()?;
}
None => break,
}
}
Ok(())
}
fn skip_unexpected_keys_in_array() -> JsonParseResult<(), io::Error> {
let json = r#"
[
"a",
"b",
true,
"c",
1,
"d",
[ 1, 2, 3, {}, 4, 5, ["yo"]],
"e",
{ "x": 1, "y": [9, 8, 7] },
"f"
]
"#;
let mut r = Cursor::new(json.as_bytes());
let mut json_reader = JsonReader::new(1024, &mut r);
json_reader.expect_start_array()?;
loop {
match json_reader.next()? {
JsonReadToken::StringLiteral(s) => {
println!("array element: {}", s);
}
JsonReadToken::EndArray => {
break;
}
JsonReadToken::NumberLiteral(_) |
JsonReadToken::BooleanLiteral(_) |
JsonReadToken::NullLiteral => {
println!("unexpected array element, skipping");
}
JsonReadToken::StartObject |
JsonReadToken::StartArray => {
println!("skipping over a nested structure");
json_reader.skip_to_end_of_current_scope()?;
}
JsonReadToken::EndObject |
JsonReadToken::Key(_) |
JsonReadToken::EndOfStream => {
return Err(JsonParseError::Parse(JsonReadToken::EndOfStream.kind(), json_reader.location()));
}
}
}
Ok(())
}