【发布时间】:2021-02-22 19:23:27
【问题描述】:
我正在试验 Rust 并尝试为 Rust 中的 Elasticsearch 查询编写一个包装器。我已经实现了一个查询并且它工作正常,但是我真的不喜欢我使用json! 宏的方式。
fn main() {
let actual = Query {
field: "field_name".into(),
values: vec![1, 2, 3],
boost: Some(2),
name: Some("query_name".into()),
};
let expected = serde_json::json!({
"terms": {
"field_name": [1, 2, 3],
"boost": 2,
"_name": "query_name"
}
});
let actual_str = serde_json::to_string(&actual).unwrap();
let expected_str = serde_json::to_string(&expected).unwrap();
assert_eq!(actual_str, expected_str);
}
#[derive(Debug)]
struct Query {
field: String,
values: Vec<i32>,
boost: Option<i32>,
name: Option<String>,
}
impl serde::Serialize for Query {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let field = self.field.as_str();
let values = self.values.as_slice();
let value = match (&self.boost, &self.name) {
(None, None) => serde_json::json!({ field: values }),
(None, Some(name)) => serde_json::json!({ field: values, "_name": name }),
(Some(boost), None) => serde_json::json!({ field: values, "boost": boost }),
(Some(boost), Some(name)) => {
serde_json::json!({ field: values, "boost": boost, "_name": name })
}
};
serde_json::json!({ "terms": value }).serialize(serializer)
}
}
我想知道如何使用 serde 的内置特征(例如 SerializeStruct、SerializeMap 等)实现这样的序列化程序。基本上我想避免使用 json 宏或创建中间数据结构。
【问题讨论】:
-
我没有得到您想要避免实施序列化的问题?另外,json 是无序的,所以不推荐比较字符串输出。