如何在 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}");
}

Plaground link

正如@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 将是一个更有效的解决方案,因为它存储按键排序的项目,因此您根本不需要对项目进行排序.