json - 当结构已知但 key 未知时反序列化 JSON

标签 json rust

我正在尝试反序列化一些加密交换 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/

相关文章:

ruby-on-rails - 渲染 json 中的哈希火箭与冒号 :

javascript - 使用 Jquery、Json 和循环访问脚本内的 HTML 内容

ruby - 如何使用 ruby​​ ffi gem 调用 Rust 库中的独立函数?

javascript - 使用 web-sys 而不是普通的旧 JavaScript 是否有性能提升?

process - 无法通过管道多次传入或传出生成的子进程

带有 Webview 的 Android JSON 自定义 ListView

java - 如何使用 Jsoup 和 Gson 提取 JSON 字段

rust - 如何在 Rust 中将 u16 的低/高 8 位转换为 u8?

javascript - 循环 JSON 对象以检查给定值是否存在

json - 我如何进行模式匹配以获得 serde_json 已解析的数字?