8个版本 (破坏性)

0.7.0 2022年1月14日
0.6.0 2022年1月6日
0.5.1 2021年12月1日
0.5.0 2021年11月17日
0.1.0 2021年9月23日

#2270 in 数据结构

每月40次下载

MIT/Apache

54KB
1K SLoC

泛型JSON特质

文档 包信息 仓库

JSON是一种广泛应用于许多应用中的通用格式。根据上下文,没有一种单一的存储JSON值的方式,有时会导致某些应用在同一个地方使用多个JSON值的表示形式。这可能会给不关心JSON值实际内部表示的JSON处理库带来问题,但它们被迫坚持某种特定的格式,从而导致不同格式之间不必要的和代价高昂的转换。

该包抽象了处理JSON的不同库中定义的JSON数据结构,如jsonserde_json等。目标是尽可能去除对这些库的硬依赖,并允许下游用户选择其首选的库。它基本上定义了一个特质Json和一个抽象实现细节的ValueRef类型。

Json特质必须由JSON值类型实现,并定义了用于表示JSON值每个组件的不可见类型。它还提供了一个返回值为ValueRef枚举类型的函数。其简化定义如下

/// JSON model.
pub trait Json: Sized + 'static {
    /// Literal number type.
    type Number;

    /// String type.
    type String;

    /// Array type.
    type Array;

    /// Object key type.
    type Key;

    /// Object type.
    type Object;

    /// Returns a reference to this value as a `ValueRef`.
    fn value(&self) -> ValueRef<'_, Self>;

    /// Metadata type attached to each value.
    type MetaData;

    fn metadata(&self) -> &Self::MetaData;
}

ValueRef公开了JSON值引用的结构

pub enum ValueRef<'v, T: Json> {
    Null,
    Bool(bool),
    Number(&'v T::Number),
    String(&'v T::String),
    Array(&'v T::Array),
    Object(&'v T::Object)
}

同样,此包还定义了一个ValueMut类型,用于可变引用。这允许每个实现者都有自己的值内部表示,同时允许互操作性。

外部实现

此库可选地提供了以下外部类型的Json特质实现,由其关联功能启用。

类型 功能门
serde_json::Value serde_json-impl
ijson::IValue ijson-impl

特质别名

当启用nightly功能时,此包还定义了一些特质别名,它们定义了JSON数据类型的常见要求。例如,JsonClone特质别名确保JSON值的每个组件都实现了Clone

许可证

许可协议为以下之一

由您选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,均应按上述方式双重许可,不附加任何额外条款或条件。

依赖关系

~60–500KB