問題
我正在嘗試通過決議如下所示的自定義宏格式來生成一個 json 物件(使用 serde):
Plot.Polar.max: 20
Plot.Polar.min: 0
Plot.Polar.numberlabel: 0101
Plot.Polar.chartname: small-chart
Plot.Polar.Var.1:
Plot.Polar.Var.2: A label: with T ES[T] #Data
我堅持的是如何設定物件的鍵。在我的舊 JavaScript 代碼中,我拆分了\n、.和:,有幾個嵌套回圈,最后有一個 reduceRight 來創建這樣的物件:
// rowObject equals one row in the old macro format
let rowObject = keys.reduceRight(
(allKeys, item) => ({ [item]: allKeys }),
val,
);
我的目標
我的目標是使用該 json 物件根據自定義宏中的鍵和值生成 highcharts 配置(json)。我希望能夠只列印 json 格式的宏,因此為什么我想先將宏轉換為 json 而不是使用單獨的資料結構(盡管這可能是個好主意?)。我想從宏生成的 json 是這樣的:
{
"Plot": {
"Polar": {
"max": 20,
"min": 0
}
}
}
我試過的
Map::insert雖然我不確定如何構造密鑰字串。在這種情況下如何管理 Map 物件?- 我看到的另一個解決方案是從原始字串創建物件并將每個 rowObject 與主物件合并,盡管這種方法感覺有點 hacky。
我的當前回圈:
// pseudo
// let mut json_macro = new Map();
for row in macro_rows.iter() {
let row_key_value: Vec<&str> = row.split(':').collect();
let keys = row_key_value[0];
let value = row_key_value[1];
let keys_split: Vec<&str> = keys.split('.').collect();
for key in keys_split.iter() {
// TODO: accumulate a objects to row_object
}
// TODO: insert row_object to json_macro
}
問題
是否可以在 JavaScript 中執行 reduceRight 之類的操作或在 rust 中執行類似操作?
更新
我意識到我必須將所有值都視為字串,因為不可能知道一個數字是否為字串。最終起作用的是@gizmo 提供的解決方案。
uj5u.com熱心網友回復:
要將您的行插入json_macro您可以從左側折疊keys_split并將每個鍵插入頂級物件:
let row_key_value: Vec<&str> = row.split(':').collect();
let keys = row_key_value[0];
let value: Value = serde_json::from_str(row_key_value[1]).unwrap();
let keys_split: Vec<&str> = keys.split('.').collect();
keys_split[..keys_split.len() - 1]
.iter()
.fold(&mut json_macro, |object, &key| {
object
.entry(key)
.or_insert(Map::new().into())
.as_object_mut()
.unwrap()
})
.insert(keys_split.last().unwrap().to_string(), value);
關于unwrap()s 有幾點需要注意:
from_str(...).unwrap(): 我在這里決議val為 JSON 物件。這可能不是你想要的。也許相反,您想要str::parse::<i32>或其他什么。無論如何,這個決議可能會失敗。.as_object_mut().unwrap():如果輸入重新定義一個鍵,這將爆炸
Plot.Polar: 0
Plot.Polar.max: 20
- 反過來,您可能想要處理鍵已經定義為物件的情況。
keys_split.last().unwrap()不會失敗,但您可能想檢查它是否為空字串
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429791.html
上一篇:決議JSON字串時出現問題
