如何使serde反序列化BigInt为u64



我使用toml和num bigint以及serde功能来反序列化以下数据:

[[trades]]
action = "Buy"
date_time = 2019-04-15T15:36:00+01:00
fee = [1, [44000000]]
id = "#1"
price = [-1, [20154500000]]
quantity = [1, [200000000]]

但我得到了这个错误:

Error: Error { inner: ErrorInner { kind: Custom, line: Some(7), col: 14, at: Some(156), message: "invalid value: integer `20154500000`, expected u32", key: ["trades", "price"] } }

当然,如果我使价格值小于u32::MAX,程序编译得很好。但我想使用这个高值,因为我将数字缩放1e8以避免处理浮点运算。

是否可以让serde将BigInt反序列化为u64

use num_bigint::BigInt;
use serde_derive::Deserialize;
use toml::from_str;
use toml::value::Datetime;
#[derive(Debug, Deserialize)]
pub struct Trade {
pub action: String,
pub date_time: Datetime,
pub fee: BigInt,
pub id: Option<String>,
pub price: BigInt,
pub quantity: BigInt,
}
#[derive(Debug, Deserialize)]
pub struct TradeTable {
pub trades: Vec<Trade>,
}
fn main() {
let trades_string: String = String::from("[[trades]]naction = "Buy"ndate_time = 2019-04-15T15:36:00+01:00nexchange = "Degiro"nfee = [1, [44000000]]nid = "#1"nprice = [-1, [20154500000]]nquantity = [1, [200000000]]");
let trade_table: TradeTable = from_str(&trades_string).unwrap();
let trades: Vec<Trade> = trade_table.trades;
}

此外,这里还有一个Rust游乐场的链接。请注意,您需要将代码复制到本地机器,因为您需要num-bigint:中的serde功能

货物.toml

[dependencies.num-bigint]
version = "0.2.6"
features = ["serde"]

您是如何创建此文件的?是通过序列化BigInt创建的,还是手工编写的?

我手写数据。

您的数据无效,以下工作:

use num_bigint::BigInt;
use std::str::FromStr;
#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)]
pub struct Trade {
pub price: BigInt,
}
fn main() {
let price = BigInt::from_str("-201545000000000").unwrap();
let trade = Trade { price };
let j = serde_json::to_string(&trade).unwrap();
println!("{}", j);
let a: Trade = serde_json::from_str(&j).unwrap();
assert_eq!(trade, a);
let j = toml::to_string(&trade).unwrap();
println!("{}", j);
let b: Trade = toml::from_str(&j).unwrap();
assert_eq!(trade, b);
}

你不应该手动创建它。

最新更新