extern crate std;
use nanojson::{Serializer, Parser, SliceWriter};
fn main() {
let json = nanojson::stringify_as(|s| {
s.object_begin()?;
s.member("name")?; s.string("Alice")?;
s.member("scores")?;
s.array_begin()?;
s.integer(95)?;
s.integer(87)?;
s.integer(100)?;
s.array_end()?;
s.member("meta")?;
s.object_begin()?;
s.member("active")?; s.boolean(true)?;
s.member("level")?; s.integer(3)?;
s.object_end()?;
s.object_end()
})
.unwrap();
std::println!("Serialized (std): {json}");
let mut name_bytes = [0u8; 32];
let mut name_len = 0usize;
let mut scores = [0i64; 8];
let mut score_count = 0usize;
let mut active = false;
let mut level = 0i64;
nanojson::parse_as(json.as_bytes(), |p| {
p.object_begin()?;
while let Some(key) = p.member()? {
match key {
"name" => {
let s = p.string()?;
name_len = s.len();
name_bytes[..name_len].copy_from_slice(s.as_bytes());
}
"scores" => {
p.array_begin()?;
while p.array_item()? {
scores[score_count] = p.integer()?;
score_count += 1;
}
p.array_end()?;
}
"meta" => {
p.object_begin()?;
while let Some(mk) = p.member()? {
match mk {
"active" => { active = p.boolean()?; }
"level" => { level = p.integer()?; }
other => panic!("unknown meta field: {other}"),
}
}
p.object_end()?;
}
other => panic!("unknown field: {other}"),
}
}
p.object_end()?;
Ok(())
})
.unwrap();
let name = core::str::from_utf8(&name_bytes[..name_len]).unwrap();
std::println!("name: {name}");
std::println!("scores: {:?}", &scores[..score_count]);
std::println!("active: {active}");
std::println!("level: {level}");
let mut buf = [0; 512];
let json = nanojson::stringify_sized_as(&mut buf, |s| {
s.object_begin()?;
s.member("name")?; s.string("Alice")?;
s.member("scores")?;
s.array_begin()?;
s.integer(95)?;
s.integer(87)?;
s.integer(100)?;
s.array_end()?;
s.member("meta")?;
s.object_begin()?;
s.member("active")?; s.boolean(true)?;
s.member("level")?; s.integer(3)?;
s.object_end()?;
s.object_end()
})
.unwrap();
std::println!("\nSerialized (no_std, {} bytes): {}", json.len(), json);
let mut name_bytes = [0u8; 32];
let mut name_len = 0usize;
let mut scores = [0i64; 8];
let mut score_count = 0usize;
let mut active = false;
let mut level = 0i64;
let mut str_buf = [0u8; 64];
let mut p = Parser::new(json.as_bytes(), &mut str_buf);
p.object_begin().unwrap();
while let Some(key) = p.member().unwrap() {
match key {
"name" => {
let s = p.string().unwrap();
name_len = s.len();
name_bytes[..name_len].copy_from_slice(s.as_bytes());
}
"scores" => {
p.array_begin().unwrap();
while p.array_item().unwrap() {
scores[score_count] = p.integer().unwrap();
score_count += 1;
}
p.array_end().unwrap();
}
"meta" => {
p.object_begin().unwrap();
while let Some(mk) = p.member().unwrap() {
match mk {
"active" => { active = p.boolean().unwrap(); }
"level" => { level = p.integer().unwrap(); }
other => panic!("unknown meta field: {other}"),
}
}
p.object_end().unwrap();
}
other => panic!("unknown field: {other}"),
}
}
p.object_end().unwrap();
let name = core::str::from_utf8(&name_bytes[..name_len]).unwrap();
std::println!("\nParsed (no_std):");
std::println!("name: {name}");
std::println!("scores: {:?}", &scores[..score_count]);
std::println!("active: {active}");
std::println!("level: {level}");
let mut pretty_buf = [0u8; 512];
let pretty_len;
{
let mut w = SliceWriter::new(&mut pretty_buf);
let mut ser: Serializer<_, 16> = Serializer::with_pretty(&mut w, 2);
ser.object_begin().unwrap();
ser.member("name").unwrap(); ser.string(name).unwrap();
ser.member("active").unwrap(); ser.boolean(active).unwrap();
ser.member("level").unwrap(); ser.integer(level).unwrap();
ser.object_end().unwrap();
pretty_len = w.pos();
}
std::println!("\nPretty-printed:\n{}", core::str::from_utf8(&pretty_buf[..pretty_len]).unwrap());
let n = nanojson::measure(|s| {
s.object_begin()?;
s.member("name")?; s.string("Alice")?;
s.member("level")?; s.integer(3)?;
s.object_end()
});
std::println!("\n`{{\"name\":\"Alice\",\"level\":3}}` is {n} bytes.");
}
#[cfg(test)] #[test] fn test_main() { main() }