日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

如何在Rust中操作JSON,你學會了嗎?

來源: 責編: 時間:2024-02-29 14:43:46 251觀看
導讀前言我們之前在Rust 賦能前端-開發(fā)一款屬于你的前端腳手架中有過在Rust項目中如何操作JSON。圖片由于文章篇幅的原因,我們就沒詳細介紹這塊的內(nèi)容,而今天我們就抽空聊聊這個話題。-- 「如何在Rust中操作JSON,以及對最流

前言

我們之前在Rust 賦能前端-開發(fā)一款屬于你的前端腳手架中有過在Rust項目中如何操作JSON。bJJ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片bJJ28資訊網(wǎng)——每日最新資訊28at.com

由于文章篇幅的原因,我們就沒詳細介紹這塊的內(nèi)容,而今天我們就抽空聊聊這個話題。-- 「如何在Rust中操作JSON,以及對最流行的庫進行比較」bJJ28資訊網(wǎng)——每日最新資訊28at.com

好了,天不早了,干點正事哇。bJJ28資訊網(wǎng)——每日最新資訊28at.com

我們能所學到的知識點

  1. 操作JSON數(shù)據(jù)
  2. 比較 Rust 的 JSON crates

1. 操作JSON數(shù)據(jù)

創(chuàng)建JSON數(shù)據(jù)

要在Rust中處理JSON,我們可以借助相關(guān)的JSON庫。其實市面上有很多相關(guān)的庫,但是我們還是選擇一種我們比較熟悉并且流行度高的庫。--serde-json[1]bJJ28資訊網(wǎng)——每日最新資訊28at.com

我們可以通過運行以下命令來安裝它:bJJ28資訊網(wǎng)——每日最新資訊28at.com

cargo add serde-json

完成后,我們可以像這樣手動創(chuàng)建JSON:bJJ28資訊網(wǎng)——每日最新資訊28at.com

use serde_json::{Result, Value};fn untyped_example() -> Result<()> {    // 一些JSON輸入數(shù)據(jù),作為一個&str。也許這些數(shù)據(jù)來自用戶。    let data = r#"        {            "name": "Front789",            "age": 18,            "ability": [                "Front-end development",                "Rust",                "AI"            ]        }"#;    // 將數(shù)據(jù)字符串解析為serde_json::Value。    let v: Value = serde_json::from_str(data)?;    // 通過使用方括號索引來訪問數(shù)據(jù)的部分。    println!("我是{}。一個專注于{}/{}及{}應用知識分享**的Coder",     v["name"], v["ability"][0],v["ability"][1],v["ability"][2]);    Ok(())}

然而,我們可以做得比這更好。例如,我們可以將JSON序列化為結(jié)構(gòu)體,這在許多應用中都有用途。我們可以在JSON模板、Web服務、CLI參數(shù)(這點我們的f_cli[2]就使用了它)等方面使用它。bJJ28資訊網(wǎng)——每日最新資訊28at.com

當然,我們也可以使用std::fs::write來將這些JSON數(shù)據(jù)寫入到磁盤文件中。bJJ28資訊網(wǎng)——每日最新資訊28at.com

使用Serde解析JSON

Serde是一個crate,它幫助我們將數(shù)據(jù)序列化和反序列化為各種格式,其中一個流行的用途是用于JSON。Serde提供了兩個主要的trait來幫助我們完成這一點:Serialize和Deserialize。我們可以添加了一個派生宏實現(xiàn)來幫助我們完成這一點。bJJ28資訊網(wǎng)——每日最新資訊28at.com

use serde::{Deserialize, Serialize};#[derive(Serialize, Deserialize)]pub struct MyStruct {    message: String}fn convert_json_to_struct() {    // 從json!宏創(chuàng)建一個原始的JSON字符串,并將其轉(zhuǎn)換為MyStruct結(jié)構(gòu)體    let raw_json_string = json!({"message": "Hello Front789!"});    let my_struct: MyStruct = serde_json::from_str(raw_json_string).unwrap();}

我們還可以創(chuàng)建「嵌套的JSON」,方法是將實現(xiàn)Serialize和Deserialize的結(jié)構(gòu)體作為另一個也實現(xiàn)Serialize和Deserialize的結(jié)構(gòu)體的字段:bJJ28資訊網(wǎng)——每日最新資訊28at.com

use chrono::{DateTime, Utc};use serde::{Deserialize, Serialize};#[derive(Serialize, Deserialize)]pub struct Post {    nested_json: PostMetadata,    title: String,    body: String}#[derive(Serialize, Deserialize)]pub struct PostMetadata {    timestamp_created: DateTime<Utc>,    timestamp_last_updated: DateTime<Utc>,    categories: Vec<String>,}

上面的代碼可以用于我們用Rust創(chuàng)建一個Web服務(還記得我們之前介紹過的Rust Web 開發(fā)之Axum使用手冊嗎),并且返回一個嵌套JSON。例如,當我們的Web服務器收到一個POST請求,其Body中是一個Json數(shù)據(jù)時,我們通常會將相關(guān)的Json類型作為處理程序函數(shù)的參數(shù)傳遞。bJJ28資訊網(wǎng)——每日最新資訊28at.com

use axum::Json;use chrono::{DateTime, Utc};use serde::{Deserialize, Serialize};#[derive(Serialize, Deserialize)]pub struct Post {    nested_json: PostMetadata,    title: String,    body: String}#[derive(Serialize, Deserialize)]pub struct PostMetadata {    timestamp_created: DateTime<Utc>,    timestamp_last_updated: DateTime<Utc>,    categories: Vec<String>,}async fn receive_some_json(  // 這個提取器消耗一個JSON主體,并將其轉(zhuǎn)換為給定的結(jié)構(gòu)類型    Json(json): Json<Post>) -> Json<Post> {    println!("{:?}", json);    Json(json)}

我們還可以從其字節(jié)表示形式轉(zhuǎn)換為結(jié)構(gòu)體:bJJ28資訊網(wǎng)——每日最新資訊28at.com

let json_as_bytes = b"        {            /"message/": /"Hello Front789!/",        }";    let my_struct: MyStruct = serde_json::from_slice(json_as_bytes).unwrap();

上面的處理方式,在我們想將一個結(jié)構(gòu)體存儲在某個地方作為字節(jié)數(shù)組,然后再將其轉(zhuǎn)換回結(jié)構(gòu)體時,有奇特的效果!bJJ28資訊網(wǎng)——每日最新資訊28at.com

類似地,我們還可以從JSON的「IO流」中讀取JSON并將其轉(zhuǎn)換為結(jié)構(gòu)體,使用.from_reader()方法。以下代碼中展示了如何在TCP流中使用它:bJJ28資訊網(wǎng)——每日最新資訊28at.com

use serde::Deserialize;use std::error::Error;use std::net::{TcpListener, TcpStream};#[derive(Deserialize, Debug)]struct User {    name: String,    age: String,}fn read_user_from_stream(tcp_stream: TcpStream) -> Result<User, Box<dyn Error>> {    let mut to_be_deserialized = serde_json::Deserializer::from_reader(tcp_stream);    let user = User::deserialize(&mut to_be_deserialized)?;    Ok(user)}fn main() {    let listener = TcpListener::bind("127.0.0.1:7890").unwrap();    for stream in listener.incoming() {        println!("{:#?}", read_user_from_stream(stream.unwrap()));    }}

這樣,當我們在遇到需要處理JSON的數(shù)據(jù)時,我們就可以直接從流中反序列化,而不是在內(nèi)存中添加緩沖區(qū)。bJJ28資訊網(wǎng)——每日最新資訊28at.com

2. 比較 Rust 的 JSON crates

其實,在大部分情況下,serde-json已經(jīng)能夠滿足我們的需求了。但是,在一些特殊情況下,例如數(shù)據(jù)量過大,此時serde-json就有點吃力了。所以,市面上又有了一些提高 JSON 解析性能的crate。(simd-json/sonic-rs)bJJ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片bJJ28資訊網(wǎng)——每日最新資訊28at.com

從上圖可知serde-json有碾壓式優(yōu)勢,也就是不到萬不得已,我們還是使用serde-json。不過,本著知己知彼,方能百戰(zhàn)不殆。我們也需要知曉額外的解決方案。bJJ28資訊網(wǎng)——每日最新資訊28at.com

這些 crates 大部分具有相同的 API。除非另有說明,否則我們可以安全地在這些庫之間切換,并期望在每個庫中使用 JSON 時具有大致相同的接口。bJJ28資訊網(wǎng)——每日最新資訊28at.com

serde-json

serde-json 是 Rust 中下載和使用最多的 JSON 庫之一。bJJ28資訊網(wǎng)——每日最新資訊28at.com

就性能而言,serde-json 本身并不慢。然而,然后對比其他兩個crate就有點稍遜了。這主要是因為它被采用非并行化的 CPU 使用架構(gòu)。這樣的話,serde-json就無法在x86 CPU的系統(tǒng)架構(gòu)上,發(fā)揮更強的作用。bJJ28資訊網(wǎng)——每日最新資訊28at.com

x86 是一種廣泛使用的中央處理單元 (CPU) 計算機架構(gòu)。它已成為個人計算機和服務器的主導架構(gòu)。x86這個名稱源自 8086,這是英特爾? 發(fā)布的早期處理器。x86 CPU 使用「復雜指令集計算機」 (CISC) 設計,允許它們在「單個周期內(nèi)執(zhí)行多條指令」。x想了解更多關(guān)于x86 CPU的內(nèi)容,可以參考x86介紹[3]bJJ28資訊網(wǎng)——每日最新資訊28at.com

simd-json

simd-json[4] 是 simdjson C++ JSON 解析器的 Rust 版本,內(nèi)置了 serde 兼容性。正如其名稱所示,此庫使用 SIMD(單指令多數(shù)據(jù))。這是一種用于能夠使用并行處理處理多個數(shù)據(jù)點的技術(shù),使其速度顯著更快!然而,作為一個注意事項,它要求我們的系統(tǒng)具有 x86 能力,并且在運行時會選擇最佳的 SIMD 特性集以獲得性能。bJJ28資訊網(wǎng)——每日最新資訊28at.com

文檔中提到 simd-json 可以在本機目標編譯時充分發(fā)揮作用。我們可以通過在運行程序時啟用 rustc 中的以下編譯器選項來實現(xiàn)此目標,例如:bJJ28資訊網(wǎng)——每日最新資訊28at.com

rustc -C target-cpu=native

然而,如果我們像大多數(shù)使用 Cargo 的人一樣,我們可能想使用 cargo run。與示例中一樣,我們可以在 .cargo/config 中創(chuàng)建一個配置,然后添加以下內(nèi)容:bJJ28資訊網(wǎng)——每日最新資訊28at.com

[build]rustflags = ["-C", "target-cpu=native"]

在.cargo/config配置相關(guān)的內(nèi)容,我們在Rust交叉編譯Windows環(huán)境時候,也涉及到。bJJ28資訊網(wǎng)——每日最新資訊28at.com

[target.x86_64-pc-windows-gnu]linker = "x86_64-w64-mingw32-gcc"

一般來說,盡管這個庫非常快,但應該注意到這個 crate 中有相當多的不安全代碼,因為它是 C++ crate 的一個移植。這并不意味著我們不應該使用它,而是要謹慎使用。bJJ28資訊網(wǎng)——每日最新資訊28at.com

還應該提到的是,為了獲得最佳性能,通常最好啟用 jemalloc 或 mimalloc 特性,以充分利用庫。bJJ28資訊網(wǎng)——每日最新資訊28at.com

通常情況下,simd-json 的 API 與 serde-json 相同,因此如果我們想在任何時候切換,通常不應該遇到任何問題。bJJ28資訊網(wǎng)——每日最新資訊28at.com

sonic-rs

sonic-rs[5] 是具有 SIMD 功能的 JSON 操作的 Rust 實現(xiàn)。這個庫還有一個 C++ 和 Go 的對應庫!盡管它曾經(jīng)需要 Rust nightly 工具鏈,但現(xiàn)在支持穩(wěn)定的 Rust。與 simd-json 類似,它也需要 x86 CPU 架構(gòu)才能充分發(fā)揮作用。bJJ28資訊網(wǎng)——每日最新資訊28at.com

與 simd-json 一樣,要使用 sonic-rs,我們需要在運行程序時啟用 rustc 中的以下編譯器選項:bJJ28資訊網(wǎng)——每日最新資訊28at.com

rustc -C target-cpu=native

我們可以在 .cargo/config 中創(chuàng)建一個配置,然后添加以下內(nèi)容以在使用 cargo run 時啟用它:bJJ28資訊網(wǎng)——每日最新資訊28at.com

[build]rustflags = ["-C", "target-cpu=native"]

這樣我們就可以構(gòu)建支持 SIMD 的程序而無需做其他操作!bJJ28資訊網(wǎng)——每日最新資訊28at.com

與 simd-json 類似,這個庫中使用了相當多的不安全代碼。然而,如果我們在庫中搜索不安全代碼,我們會發(fā)現(xiàn)比之前的庫中的不安全代碼可能更多。bJJ28資訊網(wǎng)——每日最新資訊28at.com

sonic-rs 還具有一些額外的方法來進行惰性評估和提高速度。例如,如果我們想要一個 JSON 字符串文字,我們可以在反序列化時使用 LazyValue 類型將其轉(zhuǎn)換為一個仍然帶有斜杠的 JSON 字符串值。如果我們不怕不安全行為,或者確信它不會出錯,還有很多未經(jīng)檢查的方法可供我們使用。bJJ28資訊網(wǎng)——每日最新資訊28at.com

盡管 sonic-rs 是一個非常快的庫,但它也是一個較新的 crate,因此某些方法,如 from_reader(允許從 IO 流讀取)在 crate 中缺失。bJJ28資訊網(wǎng)——每日最新資訊28at.com

Reference

[1]bJJ28資訊網(wǎng)——每日最新資訊28at.com

serde-json:https://crates.io/crates/serde_jsonbJJ28資訊網(wǎng)——每日最新資訊28at.com

[2]f_cli:https://www.npmjs.com/package/f_cli_fbJJ28資訊網(wǎng)——每日最新資訊28at.com

[3]x86介紹:https://www.lenovo.com/us/en/glossary/x86/bJJ28資訊網(wǎng)——每日最新資訊28at.com

[4]simd-json:https://crates.io/crates/simd-jsonbJJ28資訊網(wǎng)——每日最新資訊28at.com

[5]sonic-rs:https://crates.io/crates/sonic-rsbJJ28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-75358-0.html如何在Rust中操作JSON,你學會了嗎?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Body-Parser:一個格式化請求體數(shù)據(jù)的 Express 三方庫

下一篇: Vue3問題:如何實現(xiàn)拼圖驗證+郵箱登錄功能?前后端!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
9l国产精品久久久久麻豆| 久久综合中文| 宅男精品导航| 亚洲视频精品在线| 欧美在线视频一区二区三区| 亚洲一区日韩| 久久国产精品黑丝| 免费一级欧美片在线观看| 欧美成人乱码一区二区三区| 国产精品大片免费观看| 国内免费精品永久在线视频| 国产一区二区日韩| 亚洲激情二区| 亚洲在线免费观看| 亚洲影视综合| 老**午夜毛片一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 欧美电影美腿模特1979在线看| 六月天综合网| 欧美日韩免费区域视频在线观看| 欧美日韩国产一中文字不卡| 国产麻豆精品视频| 亚洲精品久久久久| 亚久久调教视频| 欧美波霸影院| 国产午夜精品视频| 日韩午夜高潮| 久久精品国亚洲| 国产精品黄色在线观看| 在线精品国精品国产尤物884a| 亚洲国产精品www| 亚洲欧美精品在线| 欧美紧缚bdsm在线视频| 国产日韩亚洲欧美精品| 99国产精品久久久| 亚洲在线观看视频| 欧美有码在线观看视频| 欧美日本一区二区高清播放视频| 国产精品超碰97尤物18| 亚洲国产另类久久精品| 欧美一区二区高清| 欧美日韩在线视频一区| 亚洲福利免费| 久久黄色网页| 国产精品视频网站| 日韩一级成人av| 久久综合伊人77777麻豆| 国产精品永久入口久久久| 日韩视频一区| 牛牛影视久久网| 国自产拍偷拍福利精品免费一| 亚洲人www| 久久在线精品| 国产一区二区三区久久悠悠色av | 亚洲欧美日韩在线高清直播| 欧美国产先锋| 国产精品剧情在线亚洲| 亚洲精品中文字幕女同| 玖玖玖免费嫩草在线影院一区| 欧美日韩亚洲网| 国产婷婷色一区二区三区| 亚洲午夜精品一区二区| 欧美日韩亚洲一区二区三区四区| 国产区二精品视| 亚洲永久网站| 欧美午夜国产| 一本大道久久a久久综合婷婷| 欧美专区第一页| 国产精品一区二区你懂的| 亚洲视频欧美在线| 欧美日韩综合另类| 亚洲最新合集| 欧美日韩一区三区| 一区二区国产精品| 国产精品www色诱视频| 一本大道久久精品懂色aⅴ| 欧美日韩1234| 日韩一级不卡| 欧美日韩中文字幕综合视频| 这里只有精品视频| 国产精品成人一区| 亚洲精品久久久久久久久久久久久 | 好看的亚洲午夜视频在线| 一本久久综合| 欧美日产在线观看| 亚洲视频视频在线| 国产精品三区www17con| 午夜精品福利视频| 欧美日韩国产在线播放网站| 99pao成人国产永久免费视频| 久久一二三国产| 一区免费在线| 欧美阿v一级看视频| 黄色成人免费观看| 久久青青草原一区二区| 一区二区三区在线视频播放| 美女久久网站| 亚洲免费电影在线观看| 国产精品v一区二区三区| 亚洲免费在线观看| 国产欧美日韩一级| 久久久999成人| 亚洲国产一区二区三区青草影视| 久久精品一区二区三区不卡| 国产精品极品美女粉嫩高清在线| 亚洲激情电影中文字幕| 欧美精品免费看| 亚洲神马久久| 国产视频一区欧美| 美女在线一区二区| 极品日韩av| 欧美精品日韩三级| 亚洲一区二区3| 国产一区在线观看视频| 欧美成va人片在线观看| 国产精品99久久不卡二区| 欧美日韩一区二区在线播放| 亚洲欧美韩国| 伊人男人综合视频网| 欧美日韩不卡| 夜夜嗨一区二区| 国产午夜精品一区二区三区视频| 亚洲欧美日韩爽爽影院| 精品动漫3d一区二区三区| 欧美黄网免费在线观看| 亚洲综合色视频| 曰韩精品一区二区| 欧美午夜一区二区福利视频| av成人免费观看| 国产日韩欧美综合| 欧美国产第一页| 午夜精品一区二区三区在线视 | 久久动漫亚洲| 亚洲精选大片| 国产亚洲免费的视频看| 欧美精品性视频| 久久激情综合| 99精品免费| 黄色av一区| 欧美特黄一级| 久久躁日日躁aaaaxxxx| 一区二区欧美亚洲| 国内在线观看一区二区三区| 麻豆成人综合网| 亚洲一区欧美激情| 亚洲日本aⅴ片在线观看香蕉| 欧美精品国产一区| 欧美在线首页| 在线午夜精品自拍| 国产精品伊人日日| 欧美高清在线视频| 久久riav二区三区| 在线一区二区三区四区| 在线观看欧美日本| 国产伦精品一区二区| 欧美日韩精品欧美日韩精品一| 亚洲一区二区三区精品视频| 亚洲国产婷婷香蕉久久久久久99| 欧美日韩黄色大片| 亚洲午夜一二三区视频| 亚洲大胆视频| 国产一区欧美日韩| 国产精品一二三| 久久综合中文色婷婷| 亚洲欧美日韩第一区| 一区二区在线免费观看| 国产精品美女久久久| 久久精品一二三| 亚洲欧美日韩精品久久亚洲区 | 久久视频一区二区| 亚洲视频一区| 国产综合激情| 国产精品一区二区三区四区五区| 久久免费国产| 香蕉久久夜色精品| 亚洲激情网站| 红桃视频成人| 国产在线拍偷自揄拍精品| 欧美激情精品久久久久久变态| 亚洲免费人成在线视频观看| 日韩视频精品在线| 亚洲国产欧美日韩| 国产精品一区二区三区观看| 欧美精选午夜久久久乱码6080| 亚洲欧美日韩在线综合| 亚洲视频一二区| 亚洲最新合集| 一区二区电影免费观看| 激情综合五月天| 国内外成人在线视频| 国产一区二区三区四区在线观看| 欧美日韩国产在线播放| 欧美精品一级| 欧美经典一区二区| 欧美激情精品久久久久久蜜臀| 午夜在线一区二区| 亚洲男女毛片无遮挡| 亚洲免费小视频| 亚洲专区在线视频| 午夜精品婷婷| 欧美一区国产一区| 欧美在线视频一区二区| 久久久久久9999| 老司机免费视频久久|