【发布时间】:2018-04-10 02:58:31
【问题描述】:
我正在开发一个 API 包装器,但在反序列化空 JSON 对象时遇到了一些问题。
API 返回此 JSON 对象。注意entities的空对象:
{
"object": "page",
"entry": [
{
"id": "1158266974317788",
"messaging": [
{
"sender": {
"id": "some_id"
},
"recipient": {
"id": "some_id"
},
"message": {
"mid": "mid.$cAARHhbMo8SBllWARvlfZBrJc3wnP",
"seq": 5728,
"text": "test",
"nlp": {
"entities": {} // <-- here
}
}
}
]
}
]
}
这是 message 属性的等效结构(已编辑):
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct TextMessage {
pub mid: String,
pub seq: u64,
pub text: String,
pub nlp: NLP,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct NLP {
pub entities: Intents,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Intents {
intent: Option<Vec<Intent>>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Intent {
confidence: f64,
value: String,
}
Serde 默认是反序列化Options,即None,用::serde_json::Value::Null。
【问题讨论】:
-
为什么选择
Vec来表示JSON 对象?您希望这些价值如何转移?事实上,如果 API 总是 返回一个对象(或数组,等等),为什么你的结构中还有一个Option? -
是的,你是对的,结构的结构是错误的。我编辑了代码
标签: rust serde serde-json