Serde json 值省略 None 上的属性

Serde json value omit properties on None

给定以下 JsonValue:

let mut schema = json!({
    "level": "strict",
    "rule": {}
});

我们将动态插入值到这个 JsonValue 的地方

let value: json!({
    "type": property.r#type,
    "minLength": property.min_length,
    "maxLength": property.max_length,
    "enum": property.r#enum
});

schema["rule"]
    .as_object_mut()
    .unwrap()
    .insert(
        String::from(property.name), 
        value
    );

// Struct for Property
#[derive(Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SchemaDocumentProperty
{
    pub name: String,
    pub r#type: Option<String>,
    pub min_length: Option<u32>,
    pub max_length: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub r#enum: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub items: Option<SchemaDocumentPropertyArray>
}

当前输出如下,其中 minLengthmaxLengthenum 为 None:

{
    "type": "string",
    "minLength": null,
    "maxLength": null,
    "enum": null
}

我想要的输出:

{
    "type": "string"
}

我想省略 JsonValue 宏中的所有 None 值。

只需创建一个 Value 结构而不是使用 json! 宏:

#[derive(Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Value
{
    #[serde(skip_serializing_if = "Option::is_none")]
    pub r#type: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub min_length: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub max_length: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub r#enum: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub items: Option<SchemaDocumentPropertyArray>
}

如果您需要 serde_json::Value 使用 to_value 方法:

let value = Value { ... };
let json_value = serde_json::to_value(value).expect("Valid json value");