我正在尝试反序列化一些加密交换 JSON。 JSON 的结构是可预测的,但键不是。每次服务器添加新货币时,它都会成为一个新 key 。例如,它看起来像这样:
{
"timestamp":"1562405",
"username":"1234",
"BTC":
{"available":"0.00","orders":"0.00000000"},
"BCH":
{"available":"0.0000000","orders":"0.00000000"},
..
..
"GUSD":
{"available":"0.00","orders":"0.00"}
}
我尝试了定义反序列化结构的常用方法,但每次出现新货币时,我的程序都会出错。
我想我会把它全部读入 Value
然后手动迭代它以将其全部放入一个结构中。
let balance_data: Value = serde_json::from_str(&String::from_utf8_lossy(&body)).unwrap();
println!("balance_data: {:?}", balance__data);
for element in balance_data.iter() {
//push into a proper map...
}
但我不能:
no method named `iter` found for type `serde_json::Value`.
我想我会把它放到 Vec<Value>
中但这会引起 panic :
thread 'main' panicked at 'called ``Result::unwrap()` on an `Err` value: Error("invalid type: map, expected a sequence", line: 1, column: 0)'`
我还尝试将其读入 HashMap
但似乎无法破解它。
如果我们能做这样的事情就太棒了:
let balance_data: RecvBalance = serde_json::from_str(&String::from_utf8_lossy(&body)).unwrap();
#[derive(Debug, Deserialize)]
struct RecvBalance {
timestamp: String,
username: String,
HashMap<String, RecvBalanceData>,
}
#[derive(Debug, Deserialize)]
struct RecvBalanceData {
available: String,
orders: String,
}
有没有人处理过这种情况?我需要一个包含余额数据的结构,以便稍后在我的程序中查找。
最佳答案
doc有一个相关的例子。您需要放置 HashMap
并使用 flatten
属性:
#[derive(Debug, Deserialize)]
struct RecvBalance {
timestamp: String,
username: String,
#[serde(flatten)]
moneys: HashMap<String, RecvBalanceData>,
}
关于json - 当结构已知但 key 未知时反序列化 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56920063/