#python #json #convert-json #serde-json #native #object #again

cpython-json

将原生 Python 对象转换为 serde_json 值,并再次转换回来

4 个版本 (2 个破坏性更新)

使用旧的 Rust 2015

0.3.0 2018 年 10 月 2 日
0.2.0 2017 年 8 月 30 日
0.1.1 2017 年 2 月 7 日
0.1.0 2017 年 1 月 15 日

#17 in #again


2 个 crate 中使用(通过 gateway

MIT/Apache

19KB
264

rust-cpython-json

crates.io docs.rs Build Status

cpython-json 将原生 Python 对象(通过 cpython PyObject)转换为 serde_json Value,并再次转换回来。

它是为 crowbar 开发的,crowbar 是用于在 AWS Lambda 中使用 Python 执行环境编写原生 Rust 代码的包装器。由于 Lambda 是一个 JSON 输入、JSON 输出的 API,所有通过 crowbar 传递的对象都是可序列化为 JSON 的。

在这个过程中,值实际上并没有转换为 JSON;序列化和反序列化 JSON 是缓慢的。相反,PyObject 被原生转换为与 Value 相当匹配的类型,并且可以从模式匹配的 Value 直接创建 PyObject

Python json 模块可以转换成 JSON 的数据类型可以使用此方法进行转换。(如果您发现 Python json 模块中某个功能在 cpython-json 中不起作用,请提交一个问题并附上您的测试用例。)

用法

cpython-json 添加到您的 Cargo.toml 文件中,与 cpython 一起

[dependencies]
cpython = "*"
cpython-json = "0.3"

cpython 类似,默认使用 Python 3。要使用 Python 2

[dependencies.cpython-json]
version = "0.3"
default-features = false
features = ["python27-sys"]

以下示例代码读取 sys.hexversion 并生成类似版本字符串的内容(为简洁起见,不包括发布级别和序列号)

extern crate cpython;
extern crate cpython_json;
extern crate serde_json;

use cpython::*;
use cpython_json::to_json;
use serde_json::Value;

fn main() {
    let gil = Python::acquire_gil();
    println!("{}", version(gil.python()).expect("failed to get Python version"));
}

fn version(py: Python) -> PyResult<String> {
    let sys = py.import("sys")?;
    let py_hexversion = sys.get(py, "hexversion")?;
    let hexversion = match to_json(py, &py_hexversion).map_err(|e| e.to_pyerr(py))? {
        Value::U64(x) => x,
        Value::I64(x) => x as u64,
        _ => panic!("hexversion is not an int"),
    };

    Ok(format!("{}.{}.{}", hexversion >> 24, hexversion >> 16 & 0xff, hexversion >> 8 & 0xff))
}

依赖项

~1.2–1.9MB
~38K SLoC