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

How to correctly parse JSON with Unicode escape sequences?

playground

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_jsonstr::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);
    }
}

Playground

我认为事情比您想象的更接近成功。您的问题不是转义序列没有被正确解释,而是 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 字符串。