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>
}
当前输出如下,其中 minLength
、maxLength
和 enum
为 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");
给定以下 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>
}
当前输出如下,其中 minLength
、maxLength
和 enum
为 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");