【问题标题】:How to correctly parse JSON with Unicode escape sequences?如何正确解析带有 Unicode 转义序列的 JSON?
【发布时间】:2021-08-31 15:39:07
【问题描述】:

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

对象键"a"的值如何转化为如下字符串?

b\u{1f}c

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

【问题讨论】:

    标签: rust unicode escaping serde-json


    【解决方案1】:

    问题出在这一行:

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

    Playground

    【讨论】:

    • 非常感谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-08-08
      • 2023-03-05
      • 2015-04-23
      • 2014-08-16
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 2018-10-09
      相关资源
      最近更新 更多