use nextjson::cross_format;
fn main() -> nextjson::Result<()> {
let source = br#"{
"order_id": "ord_1024",
"customer": "Ada Lovelace",
"items": [
{"sku": "A-1", "qty": 2, "price": 9.99},
{"sku": "B-7", "qty": 1, "price": 149.5}
],
"paid": true,
"notes": null
}"#;
let cbor = cross_format::json_to_cbor(source)?;
println!("json_to_cbor: {} B -> {} B", source.len(), cbor.len());
let json_round = cross_format::cbor_to_json(&cbor)?;
println!("cbor_to_json: {} B -> {} B", cbor.len(), json_round.len());
let a: nextjson::Value = nextjson::from_slice(source)?;
let b: nextjson::Value = nextjson::from_slice(&json_round)?;
assert_eq!(a, b, "中继必须保持数据语义");
println!("中继往返数据语义一致: Value 相等");
let mut out_cbor = Vec::new();
cross_format::json_to_cbor_writer(source, &mut out_cbor)?;
assert_eq!(out_cbor, cbor, "writer 变体与分配版本逐字节一致");
let mut out_json = Vec::new();
cross_format::cbor_to_json_writer(&out_cbor, &mut out_json)?;
assert_eq!(out_json, json_round, "writer 变体与分配版本逐字节一致");
println!("writer 变体输出与分配版本逐字节一致");
let pretty = cross_format::cbor_to_json_pretty(&cbor)?;
let text = String::from_utf8(pretty).expect("cbor_to_json_pretty 输出 UTF-8");
println!("\n--- cbor_to_json_pretty 输出 ---\n{text}");
println!("\n== 批量 JSON -> CBOR 体积对比 ==");
let mut batch = Vec::new();
batch.extend_from_slice(b"[");
for i in 0..100 {
if i > 0 {
batch.push(b',');
}
batch.extend_from_slice(source);
}
batch.push(b']');
let batch_cbor = cross_format::json_to_cbor(&batch)?;
println!(
"100 条订单 JSON: {} B -> CBOR: {} B ({:.1}%)",
batch.len(),
batch_cbor.len(),
batch_cbor.len() as f64 / batch.len() as f64 * 100.0
);
Ok(())
}