如何使用Unicode转义序列正确解析JSON



操场

use serde_json::json; // 1.0.66
use std::str;
fn main() {
let input = "{"a": "b\u001fc"}";
let bytes = input.as_bytes();
let json: serde_json::Value = serde_json::from_slice(bytes).unwrap();
for (_k, v) in json.as_object().unwrap() {
let vec = serde_json::to_vec(v).unwrap();
let utf8_str = str::from_utf8(&vec).unwrap();
println!("value: {}", v);
println!("utf8_str: {}", utf8_str);
println!("bytes: {:?}", vec);
}
}

如何将对象关键字"a"的值转换为以下字符串?

bu{1f}c

我尝试过serde_jsonstr::from_utf8,但结果总是得到"bu001fc"。转义字符序列的解释不正确。如何解决这个问题?

问题是这一行:

let vec = serde_json::to_vec(v).unwrap();

来自to_vec()上的serde_json文档:

将给定的数据结构序列化为JSON字节向量。

您正在从JSON进行反序列化,获取对象的值,将它们序列化回JSON并打印出来。你不想序列化回JSON,你想打印;生的";字符串,所以像这样的东西可以做你想要的:

fn main() {
let input = "{"a": "b\u001fc"}";
let bytes = input.as_bytes();
let json: serde_json::Value = serde_json::from_slice(bytes).unwrap();
for (_k, v) in json.as_object().unwrap() {
let string = v.as_str().unwrap();
println!("bytes: {:?}", string);
}
}

游乐场

我认为事情比你想象的更接近运作。您的问题不是转义序列没有得到正确解释,而是serde_json::to_vec(v)本质上将v(即serde_json::value::Value::String)重新编码为JSON编码的字节的向量。这意味着它会拾取周围的引号字符(字节34),并将转义序列转换为文字['\', 'u', ...]——因为这就是它在JSON中的样子。

如果你想得到字符串值,你可以这样做:

for (_k, v) in json.as_object().unwrap() {
if let serde_json::value::Value::String(s) = v {
println!("{:?}", s);
}
}

这将打印您想要的Rust字符串"bu{1f}c"

最新更新