如何使用 Unicode 转义序列正确解析 JSON?
How to correctly parse JSON with Unicode escape sequences?
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);
}
}
object key"a"
的值如何转化为下面的字符串?
b\u{1f}c
我试过 serde_json
和 str::from_utf8
,但结果总是 "b\u001fc"
。转义字符序列未正确解释。如何解决?
问题出在这一行:
let vec = serde_json::to_vec(v).unwrap();
来自 to_vec()
上的 serde_json
文档:
Serialize the given data structure as a JSON byte vector.
您正在从 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);
}
}
这会打印出 "b\u{1f}c"
,你想要的 Rust 字符串。
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);
}
}
object key"a"
的值如何转化为下面的字符串?
b\u{1f}c
我试过 serde_json
和 str::from_utf8
,但结果总是 "b\u001fc"
。转义字符序列未正确解释。如何解决?
问题出在这一行:
let vec = serde_json::to_vec(v).unwrap();
来自 to_vec()
上的 serde_json
文档:
Serialize the given data structure as a JSON byte vector.
您正在从 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);
}
}
这会打印出 "b\u{1f}c"
,你想要的 Rust 字符串。