0

操场

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"转化为下面的字符串?

b\u{1f}c

我试过serde_jsonand str::from_utf8,但我总是得到"b\u001fc"结果。转义字符序列未正确解释。如何解决?

4

2 回答 2

2

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

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

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

这会打印"b\u{1f}c"出你想要的 Rust 字符串。

于 2021-08-31T16:03:12.230 回答
2

问题是这一行:

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

从上的serde_json文档to_vec()

将给定的数据结构序列化为 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);
    }
}

操场

于 2021-08-31T16:01:04.933 回答