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

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

高效傳輸大的 JSON 數據,流式處理真香!

來源: 責編: 時間:2024-05-16 17:38:14 216觀看
導讀什么是 TextDecoder APITextDecoder[1] API 是一個用于將二進制數據(通常是 ArrayBuffer 或 TypedArray)解碼為字符串的 JavaScript API。它是 Web 平臺的一部分,主要用于處理文本編碼的解碼工作。比如,從服務器接收到的

什么是 TextDecoder API

TextDecoder[1] API 是一個用于將二進制數據(通常是 ArrayBuffer 或 TypedArray)解碼為字符串的 JavaScript API。它是 Web 平臺的一部分,主要用于處理文本編碼的解碼工作。比如,從服務器接收到的流式數據、文件數據等。o3g28資訊網——每日最新資訊28at.com

為什么使用 TextDecoder API

在處理 Web 應用中的二進制數據時,通常需要將這些數據轉換為可讀的字符串格式。TextDecoder 提供了一種高效且便捷的方法來實現這一點。o3g28資訊網——每日最新資訊28at.com

TextDecoder API 有以下特點:o3g28資訊網——每日最新資訊28at.com

  • 高效性:比手動逐字節處理高效,能夠直接解碼為字符串。
  • 支持多種編碼:支持多種文本編碼(如 UTF-8、UTF-16、ISO-8859-1 等),提供了靈活性。
  • 支持流式處理:能夠逐塊處理數據,適合處理大數據流或需要實時處理的數據。

如何使用 TextDecoder API

下面我們將介紹 TextDecoder API 的四種使用場景:o3g28資訊網——每日最新資訊28at.com

  1. 解碼 ArrayBuffer 數據
  2. 解碼不同編碼的二進制數據
  3. 解碼流式 JSON 數據
  4. 解碼大 JSON 文件中的數據塊

1.解碼 ArrayBuffer 數據

// 創建一個包含 UTF-8 編碼文本的 Uint8Arrayconst uint8Array = new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]);// 創建一個 TextDecoder 實例,默認使用 UTF-8 編碼const decoder = new TextDecoder('utf-8');// 將 Uint8Array 解碼為字符串const decodedString = decoder.decode(uint8Array);console.log(decodedString); // 輸出 "Hello World"

2.解碼不同編碼的二進制數據

// 使用不同的編碼創建 TextDecoder 實例const utf16Decoder = new TextDecoder('utf-16');const iso88591Decoder = new TextDecoder('iso-8859-1');// 示例二進制數據const utf16Array = new Uint16Array([0x0048, 0x0065, 0x006C, 0x006C, 0x006F]);const iso88591Array = new Uint8Array([72, 101, 108, 108, 111]);// 解碼為字符串const utf16String = utf16Decoder.decode(utf16Array);const iso88591String = iso88591Decoder.decode(iso88591Array);console.log(utf16String); // 輸出 "Hello"console.log(iso88591String); // 輸出 "Hello"

3.解碼流式 JSON 數據

首先,我們先來看一下效果:o3g28資訊網——每日最新資訊28at.com

圖片圖片o3g28資訊網——每日最新資訊28at.com

在以上的示例中,我們使用 Node.js 的 http 模塊,快速搭建一個本地 SSE[2](Server-Sent Events)服務器。o3g28資訊網——每日最新資訊28at.com

server.jso3g28資訊網——每日最新資訊28at.com

const http = require("http");const PORT = 3000;const server = http.createServer((req, res) => {  if (req.url === "/sse") {    res.writeHead(200, {      "Content-Type": "text/event-stream",      "Cache-Control": "no-cache",      Connection: "keep-alive",      "Access-Control-Allow-Origin": "*",      "Access-Control-Allow-Headers":        "Origin, X-Requested-With, Content-Type, Accept",    });    let id = 1;    const interval = setInterval(() => {      const data = {        id: id,        message: `This is message ${id}`,        timestamp: +new Date(),      };      res.write(`data: ${JSON.stringify(data)}/n/n`);      // 停止條件      if (id == 5) {        res.write("event: end/n");        res.write("data: End of stream/n/n");        clearInterval(interval);        res.end();      }      id++;    }, 1000);    req.on("close", () => {      clearInterval(interval);    });  } else {    res.writeHead(404, { "Content-Type": "text/plain" });    res.end("404 Not Found");  }});server.listen(PORT, () => {  console.log(`Server is running on http://localhost:${PORT}`);});

需要注意的是,在 sse 接口中,我們設置 Content-Type 響應頭的類型為: "text/event-stream",告訴客戶端我們返回的是流式數據。o3g28資訊網——每日最新資訊28at.com

index.htmlo3g28資訊網——每日最新資訊28at.com

??:訪問 index.html 網頁前,記得運行 node server.js 命令先啟動 SSE 服務器。o3g28資訊網——每日最新資訊28at.com

<!-- public/index.html --><!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>SSE & TextDecoder</title></head><body>    <h1>Decode Server-Sent Events JSON Stream Data</h1>    <div id="messages"></div>    <script src="client.js"></script></body></html>

client.jso3g28資訊網——每日最新資訊28at.com

document.addEventListener("DOMContentLoaded", () => {  const messagesDiv = document.querySelector("#messages");  const textDecoder = new TextDecoder("utf-8");  fetch("http://localhost:3000/sse").then((response) => {    const reader = response.body.getReader();    return new ReadableStream({      start(controller) {        function push() {          reader.read().then(({ done, value }) => {            if (done) {              controller.close();              return;            }            const chunk = textDecoder.decode(value, { stream: true });            const lines = chunk.split("/n");            for (const line of lines) {              if (line.startsWith("data: ")) {                const json = line.slice(6);                const data = JSON.parse(json);                const p = document.createElement("p");                p.textContent = `ID: ${data.id}, Message: ${data.message}, Timestamp: ${data.timestamp}`;                messagesDiv.appendChild(p);              } else if (line.startsWith("event: end")) {                const p = document.createElement("p");                p.textContent = "End of stream";                messagesDiv.appendChild(p);                return;              }            }            push();          });        }        push();      },    });  });});

SSE 事件流是一個簡單的文本數據流,文本是使用 UTF-8 格式的編碼。所以,在創建 textDecoder 對象時,我們需要設置它的編碼為 utf-8。有了 textDecoder 對象后,調用它提供的 decode 方法就可以進行解碼了。o3g28資訊網——每日最新資訊28at.com

4.解碼大 JSON 文件中的數據塊

當遇到傳輸大 JSON 數據的時候,如果使用傳統的方式,我們需要接收完整的 JSON 數據后,才能開始進行數據處理,這對用戶體驗會造成一定的影響。為了解決這個問題,我們可以使用一些現成的 JSON Stream 解析庫。比如,@streamparser/json[3],該庫內部也使用了本文介紹的 TextDecoder API。o3g28資訊網——每日最新資訊28at.com

下面,我們先來看一下效果:o3g28資訊網——每日最新資訊28at.com

上圖中輸出的 JSON 數據來自以下的 large.json 文件。我們對該文件按照 0.5KB 的大小進行切割,然后每個 500ms 發送下一個數據塊。利用 @streamparser/json 這個庫,我們實現了解析 JSON 數據流(JSON Chunk)的功能。o3g28資訊網——每日最新資訊28at.com

large.jsono3g28資訊網——每日最新資訊28at.com

[  {},  {    "image": [      {        "shape": "rect",        "fill": "#333",        "stroke": "#999",        "x": 0.5e1,        "y": 0.5,        "z": 0.8,        "w": 0.5e5,        "u": 2e10,        "foo": 2e1,        "bar": 2,        "width": 47,        "height": 47      }    ],    "corners": { "1": true, "3": true, "7": true, "9": true }  }, ...]

json-server.jso3g28資訊網——每日最新資訊28at.com

const http = require("http");const { join } = require("path");const { readFileSync } = require("fs");const PORT = 3000;const largeJson = readFileSync(join(__dirname, "large.json")).toString();const server = http.createServer((req, res) => {  if (req.url === "/stream-json") {    res.writeHead(200, {      "Content-Type": "application/json",      "Cache-Control": "no-cache",      Connection: "keep-alive",      "Access-Control-Allow-Origin": "*",      "Access-Control-Allow-Headers":        "Origin, X-Requested-With, Content-Type, Accept",    });    const CHUNK_SIZE = 512; // 每塊 0.5KB    let position = 0;    const interval = setInterval(() => {      const chunk = largeJson.slice(position, position + CHUNK_SIZE);      res.write(chunk);      position += CHUNK_SIZE;      if (position >= largeJson.length) {        clearInterval(interval);        res.end();      }    }, 500); // 每 500ms 發送一塊數據    req.on("close", () => {      clearInterval(interval);    });  } else {    res.writeHead(404, { "Content-Type": "text/plain" });    res.end("404 Not Found");  }});server.listen(PORT, () => {  console.log(`Server is running on http://localhost:${PORT}`);});

stream-json.htmlo3g28資訊網——每日最新資訊28at.com

<!DOCTYPE html><html lang="en">  <head>    <meta charset="UTF-8" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Stream JSON</title>  </head>  <body>    <h1>Stream JSON</h1>    <div id="messages"></div>    <script type="module">      import { JSONParser } from "https://cdn.jsdelivr.net/npm/@streamparser/json-whatwg@0.0.21/+esm";      const messagesDiv = document.querySelector("#messages");      document.addEventListener("DOMContentLoaded", async () => {        const parser = new JSONParser();        const response = await fetch("http://localhost:3000/stream-json");        const reader = response.body.pipeThrough(parser).getReader();        while (true) {          const { done, value: parsedElementInfo } = await reader.read();          if (done) break;          const { value, key, parent, stack, partial } = parsedElementInfo;          if (partial) {            console.log(`Parsing value: ${value}... (still parsing)`);          } else {            const p = document.createElement("p");            p.textContent = `${JSON.stringify(value)}`;            messagesDiv.appendChild(p);            console.log(`Value parsed: ${JSON.stringify(value)}`);          }        }      });    </script>  </body></html>

@streamparser/json 這個庫還有其他的用法,如果你感興趣的話,可以看一下它的使用文檔。o3g28資訊網——每日最新資訊28at.com

參考資料o3g28資訊網——每日最新資訊28at.com

[1]TextDecoder: https://developer.mozilla.org/zh-CN/docs/Web/API/TextDecodero3g28資訊網——每日最新資訊28at.com

[2]SSE: https://developer.mozilla.org/zh-CN/docs/Web/API/Server-sent_eventso3g28資訊網——每日最新資訊28at.com

[3]@streamparser/json: https://www.npmjs.com/package/@streamparser/jsono3g28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-88708-0.html高效傳輸大的 JSON 數據,流式處理真香!

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

上一篇: 即構 UIKits 重磅發布!高效開發與自定義UI兼備,打造互動場景新標桿?

下一篇: 揭秘 Python 江湖中的15個冷門但超能模塊

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
免费美女久久99| 亚洲视频一二区| 国产日韩在线看| 国产综合色精品一区二区三区| 国产夜色精品一区二区av| 在线看日韩欧美| 亚洲精选一区| 亚洲欧美韩国| 狂野欧美性猛交xxxx巴西| 欧美日韩www| 国产日韩精品一区观看 | 国产一区二区成人| 伊人久久大香线| 99伊人成综合| 久久精品国产91精品亚洲| 欧美激情在线观看| 国产精品揄拍500视频| 亚洲国产精品悠悠久久琪琪| 亚洲一区一卡| 久久先锋资源| 欧美性片在线观看| 一区福利视频| 亚洲自拍都市欧美小说| 免费久久99精品国产| 国产精品你懂得| 亚洲韩国青草视频| 欧美一级视频精品观看| 欧美精品91| 国产一区二区三区久久 | 欧美视频福利| 一区在线免费| 亚洲宅男天堂在线观看无病毒| 美女福利精品视频| 国产精品一二三视频| 亚洲美女黄网| 蜜臀av国产精品久久久久| 国产精品永久入口久久久| 日韩视频一区二区三区在线播放免费观看 | 亚洲美女av网站| 久久久久国色av免费观看性色| 欧美特黄一级大片| 91久久精品一区二区别| 久久精品国产一区二区电影| 国产精品v日韩精品| 91久久国产综合久久91精品网站| 欧美一区二区三区在线观看| 欧美日韩亚洲综合在线| 亚洲国产欧美一区| 久久久国产精品一区二区中文| 国产精品乱码妇女bbbb| 99ri日韩精品视频| 免费日本视频一区| 激情五月婷婷综合| 欧美影院在线| 国产精品综合av一区二区国产馆| 99天天综合性| 欧美国产日韩一区二区三区| 伊人精品视频| 久久免费国产| 国产一区二区三区久久| 亚洲欧美精品在线| 欧美性一区二区| 一区二区三区成人精品| 欧美精品在线极品| 亚洲欧洲偷拍精品| 牛牛影视久久网| 久久性天堂网| 国产精品亚发布| 亚洲字幕在线观看| 国产精品日韩高清| 亚洲免费在线看| 国产精品三级视频| 亚洲男人的天堂在线aⅴ视频| 欧美性猛交一区二区三区精品| 99一区二区| 欧美图区在线视频| 亚洲午夜一级| 国产精品日韩| 亚洲欧美视频| 国产视频精品va久久久久久| 欧美在线精品免播放器视频| 国产农村妇女毛片精品久久麻豆 | 欧美国产免费| 亚洲精品欧美日韩| 欧美理论在线播放| 一区二区欧美激情| 国产精品va在线播放| 亚洲一区二区成人| 国产精品自拍三区| 久久久久国产免费免费| 影音先锋亚洲视频| 欧美高清在线一区二区| 日韩午夜免费| 欧美亚洲不卡| 亚洲欧美日本伦理| 国产亚洲综合精品| 免费在线一区二区| 99精品热视频| 国产精品美女久久久久久久| 欧美一区二区三区在线免费观看| 国内精品久久久| 蜜桃久久av一区| 亚洲精选在线| 国产精品久久久久久久app| 亚洲欧美日韩国产一区二区三区| 国产亚洲激情在线| 美女尤物久久精品| 99精品免费| 国产日本精品| 美女日韩欧美| 一区二区三区日韩欧美精品| 国产精品一区毛片| 久久综合久久美利坚合众国| 亚洲美女av电影| 国产精品午夜av在线| 久久亚洲不卡| 艳女tv在线观看国产一区| 国产精品入口| 麻豆成人精品| 亚洲午夜国产成人av电影男同| 国产一区二区电影在线观看| 欧美精品一区二区三区久久久竹菊| 亚洲——在线| 永久91嫩草亚洲精品人人| 欧美日韩国产a| 欧美在线观看视频一区二区三区| 在线免费观看视频一区| 欧美色一级片| 久久嫩草精品久久久精品| 一级日韩一区在线观看| 国内精品国产成人| 欧美日韩国产首页| 久久xxxx| 99热精品在线观看| 狠狠色狠狠色综合人人| 欧美三级在线视频| 久久狠狠婷婷| 在线亚洲成人| 亚洲高清网站| 国产美女精品免费电影| 欧美激情1区2区| 久久精品二区三区| 一区二区黄色| 亚洲盗摄视频| 国产日韩欧美| 欧美日韩精品一区二区三区四区| 久久久久88色偷偷免费| 亚洲一区二区三区免费在线观看 | 你懂的视频欧美| 亚洲制服丝袜在线| 亚洲国产色一区| 国产日韩一区二区三区在线播放 | 久久一二三区| 亚洲天堂成人| 91久久久亚洲精品| 国产一区视频观看| 国产精品ⅴa在线观看h| 免费成人在线观看视频| 欧美中文在线视频| 亚洲天堂成人| 亚洲啪啪91| 红桃视频亚洲| 国产日韩专区| 国产精品久久| 欧美日韩激情网| 欧美成人国产| 久久阴道视频| 久久精品国产欧美激情| 亚洲欧美一区二区三区极速播放| 99视频精品在线| 最新中文字幕亚洲| 一区二区在线视频播放| 国产一区二区你懂的| 国产伦精品一区二区三区视频黑人| 欧美日韩国产首页在线观看| 免费视频一区二区三区在线观看| 久久成人免费视频| 亚洲欧美在线x视频| 亚洲手机在线| 制服丝袜亚洲播放| 一本到12不卡视频在线dvd| 亚洲乱码视频| 亚洲欧洲在线看| 亚洲国产欧美日韩| 亚洲国内在线| 亚洲国产日韩一区二区| 亚洲缚视频在线观看| 亚洲电影在线播放| 在线精品一区二区| 影音先锋日韩有码| 一区二区三区在线视频免费观看| 韩国视频理论视频久久| 国模精品一区二区三区色天香| 国产热re99久久6国产精品| 国产欧美成人| 国产亚洲亚洲| 国内精品99| 国产综合视频| 激情久久影院| 亚洲大胆在线| 91久久精品美女| 亚洲欧洲一区二区天堂久久| 亚洲日本成人| 一本色道久久综合亚洲精品按摩|