如何在 rust 中对 JSON 进行排序?
How to sort JSON in rust?
rust语言可以JSON排序吗?如果可以,那怎么做?
喜欢这个:
const headers = {
'checkout-account': '1234',
'checkout-algorithm': 'sha256',
'checkout-method': 'POST',
'checkout-nonce': '564635208570151',
'checkout-timestamp': '2018-07-06T10:01:31.904Z',
};
const calculateHmac = (body=false, params) => {
const hmacPayload = Object.keys(params)
.sort()
.map((key) => [key, params[key]].join(':'))
.concat(body ? JSON.stringify(body) : '')
.join('\n');
};
calculateHmac(false, headers);
Rust 中大致相同的代码:
use itertools::Itertools;
use std::collections::HashMap;
fn main() {
let headers = HashMap::from([
("checkout-account", "1234"),
("checkout-algorithm", "sha256"),
("checkout-method", "POST"),
("checkout-nonce", "564635208570151"),
("checkout-timestamp", "2018-07-06T10,01,31.904Z"),
]);
let hmac_payload = headers
.keys()
.sorted()
.map(|key| format!("{}:{}", key, headers[key]))
.join("\n");
println!("{hmac_payload}");
}
正如@cdhowie 指出的那样,Rust 使您可以选择按键对项目进行排序,而不是仅对键进行排序,然后每次都执行查找:
let hmac_payload = headers
.iter()
.sorted_by_key(|item| item.0)
.map(|item| format!("{}:{}", item.0, item.1))
.join("\n");
正如@Caesar 指出的那样,使用 BTreeMap
而不是 HashMap
将是一个更有效的解决方案,因为它存储按键排序的项目,因此您根本不需要对项目进行排序.
rust语言可以JSON排序吗?如果可以,那怎么做?
喜欢这个:
const headers = {
'checkout-account': '1234',
'checkout-algorithm': 'sha256',
'checkout-method': 'POST',
'checkout-nonce': '564635208570151',
'checkout-timestamp': '2018-07-06T10:01:31.904Z',
};
const calculateHmac = (body=false, params) => {
const hmacPayload = Object.keys(params)
.sort()
.map((key) => [key, params[key]].join(':'))
.concat(body ? JSON.stringify(body) : '')
.join('\n');
};
calculateHmac(false, headers);
Rust 中大致相同的代码:
use itertools::Itertools;
use std::collections::HashMap;
fn main() {
let headers = HashMap::from([
("checkout-account", "1234"),
("checkout-algorithm", "sha256"),
("checkout-method", "POST"),
("checkout-nonce", "564635208570151"),
("checkout-timestamp", "2018-07-06T10,01,31.904Z"),
]);
let hmac_payload = headers
.keys()
.sorted()
.map(|key| format!("{}:{}", key, headers[key]))
.join("\n");
println!("{hmac_payload}");
}
正如@cdhowie 指出的那样,Rust 使您可以选择按键对项目进行排序,而不是仅对键进行排序,然后每次都执行查找:
let hmac_payload = headers
.iter()
.sorted_by_key(|item| item.0)
.map(|item| format!("{}:{}", item.0, item.1))
.join("\n");
正如@Caesar 指出的那样,使用 BTreeMap
而不是 HashMap
将是一个更有效的解决方案,因为它存储按键排序的项目,因此您根本不需要对项目进行排序.