UniApp X 網絡請求避坑指南:從 JS 到 UTS 的 JSON 數據處理全解析

在 UniApp 開發中,我們經常需要通過?uni.request?獲取服務器返回的 JSON 數據,并將其綁定到頁面或進行邏輯處理。

但在?UniApp X(基于 UTS)?中,由于引入了?強類型語言特性,處理 JSON 數據的方式與 JS 有明顯不同。如果你還停留在 JS 的開發習慣中,很容易踩坑。

本文將帶你從 JS 的 JSON 處理方式出發,逐步過渡到 UTS 的兩種主流處理方式:

  1. ??UTSJSONObject:兼容 JS 的靈活方式
  2. ??type + 泛型:強類型推薦方案

🧩 一、JS 中的 JSON 處理方式(回顧)

在 JS 中,uni.request?獲取的 JSON 數據可以直接使用?.屬性名?的方式訪問:

uni.request({url: "https://example.com/api",success: (res) => {console.log(res.data.data[0].plugin_name);}
});

但這種方式在?UTS 中會報錯,因為:

UTS 是強類型語言,res.data 是 any 類型,不能安全訪問未定義的屬性。


🛠? 二、UTS 中處理 JSON 的兩種方式

方式一:UTSJSONObject(兼容 JS 的靈活方式)

1. 基本用法:通過下標訪問屬性
uni.request({url: "https://example.com/api",success: (res) => {const data = res.data as UTSJSONObject;const pluginName = (data["data"] as UTSJSONObject[])[0]["plugin_name"];console.log(pluginName);}
});
2. 使用 keypath 訪問深層屬性(推薦)

UTSJSONObject 支持 keypath 寫法,穿透訪問嵌套屬性:

const pluginName = data.getString("data[0].plugin_name");
console.log(pluginName); // 輸出:插件名稱A
3. 其他 keypath 方法
方法名返回類型說明
getString(path: string)string獲取字符串
getNumber(path: string)number獲取數字
getBoolean(path: string)boolean獲取布爾值
getJSON(path: string)UTSJSONObject獲取對象
getArray(path: string)UTSJSONObject[]獲取數組
getAny(path: string)any獲取任意類型

???缺點:沒有類型提示、需要手動處理類型轉換、性能略差。


方式二:type + 泛型(強類型推薦方式)

1. 定義數據類型(使用 HBuilderX 自動生成)

將服務器返回的 JSON 數據粘貼到 HBuilderX 的 JSON 編輯器中,右鍵選擇?“轉 type”,自動生成類型定義。

例如服務器返回如下數據:

{"code": 200,"desc": "","data": [{"plugin_id": 123,"plugin_name": "插件名稱A"}]
}

生成的類型為:

type Data = {plugin_id: number;plugin_name: string;
};type IRootType = {code: number;desc: string;data: Data[];
};
2. 使用泛型調用?uni.request
uni.request<IRootType>({url: "https://example.com/api",success: (res) => {if (res.data && res.data.data.length > 0) {console.log(res.data.data[0].plugin_name); // 直接使用 . 操作符}}
});
3. 泛型寫法說明
  • ??泛型寫法uni.request<IRootType>(...),告訴編譯器期望返回的數據類型。
  • ??數組類型:如果?res.data?是數組,應寫為?uni.request<IRootType[]>(...)
  • ??安全訪問:使用??.?防止空值訪問錯誤,如?res.data?.data

🧠 三、type 與泛型的常見問題

1. type 要寫在?export default?之前

為了在?data()?或?computed?中使用類型定義,必須把?type?寫在?export default?之前:

type Data = {plugin_id: number;plugin_name: string;
};export default {data() {return {dataList: [] as Data[]};}
};

2. 屬性可能缺失怎么辦?

使用???表示該屬性可為空:

type Data = {plugin_id: number;plugin_name?: string; // plugin_name 可能不存在age: number | null; // age 可為 null
};

3. 泛型支持情況

  • ? 當前版本支持傳入?type?作為泛型
  • ? 不支持動態泛型,如將泛型作為函數參數傳遞
  • ? Web 端目前僅支持類型校驗,不支持實例化

📦 四、實戰案例:網絡請求 + 數據綁定 + 分頁加載

<template><list-view style="flex: 1;" @scrolltolower="loadData"><template v-for="(item, index) in dataList" :key="index"><list-item style="flex-direction: row; padding: 10px;"><text>{{ item.plugin_name }}</text></list-item></template><list-item v-if="loadingText"><text>{{ loadingText }}</text></list-item></list-view>
</template><script lang="uts">type Plugin = {plugin_id: number;plugin_name: string;};type ResponseType = {code: number;desc: string;data: Plugin[];};export default {data() {return {dataList: [] as Plugin[],loading: false,isEnded: false,currentPage: 1};},computed: {loadingText(): string {if (this.loading) return "加載中...";if (this.isEnded) return "沒有更多了";return "";}},onLoad() {this.loadData();},methods: {loadData() {if (this.loading || this.isEnded) return;this.loading = true;uni.request<ResponseType>({url: "https://example.com/api",data: {page: this.currentPage,pageSize: 10},success: (res) => {if (res.data?.data?.length) {this.dataList.push(...res.data.data);this.currentPage++;} else {this.isEnded = true;}},fail: (err) => {console.error("加載失敗", err);},complete: () => {this.loading = false;}});}}};
</script>

🧪 五、UTS JSON 處理對比表

特性UTSJSONObjecttype + 泛型
類型提示? 無? 有
代碼可讀性?? 略差? 好
類型安全? 弱? 強
性能表現?? 略差? 好
使用難度? 簡單?? 稍復雜
適用人群初學者有 TS 經驗者
推薦指數????????

📌 六、注意事項

  • ??UTSJSONObject?適用于鍵名動態或結構不穩定的數據
  • ??type + 泛型?更適合結構固定、追求類型安全和代碼提示的項目
  • ???type?中屬性名不能包含特殊字符如?:-,否則需手動處理或改用?UTSJSONObject
  • ?? 泛型不支持動態傳參,封裝?request?時建議使用?UTSJSONObject

🧠 最后一句話送大家:

“從 JS 到 UTS,不是語法的改變,而是對數據結構理解的升華。”
掌握好 JSON 數據的處理方式,你就能在 UniApp X 的世界里,寫出更穩定、更高效、更跨平臺的應用!


如果你覺得這篇文章對你有幫助,歡迎點贊、收藏、轉發給還在為 UTS JSON 問題發愁的小伙伴!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916175.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916175.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS 網絡請求常用依賴庫與系統自帶 API 介紹與示例

iOS 網絡請求常用依賴庫與系統自帶 API 介紹與示例 在 iOS 開發中&#xff0c;進行網絡請求是幾乎所有應用都不可或缺的功能。開發者有多種選擇來處理網絡通信&#xff0c;從系統自帶的 URLSession 到各種流行的第三方庫。下面我將為您介紹 URLSession、AFNetworking、Alamofir…

JavaScript 中 let 在循環中的作用域機制解析

一、let在循環中的特殊性 let作為ES6引入的塊級作用域聲明&#xff0c;在循環結構中存在特殊行為&#xff0c;其核心區別于var的函數作用域特性。理解這一特性對于編寫正確的閉包邏輯至關重要。 在 ECMAScript 規范里&#xff0c;let聲明的變量具有塊級作用域特性&#xff0c;這…

@Subscribe@AllowConcurrentEvents解析這兩個注解

@Subscribe@AllowConcurrentEvents解析這兩個注解 @Subscribe 和 @AllowConcurrentEvents 是 Guava EventBus(Google 開源的事件總線框架)中用于處理事件訂閱的注解,主要用于實現組件間的解耦通信。下面分別解析: 1. @Subscribe 注解 作用:標記一個方法為事件訂閱者方法,…

好看的小程序推廣單頁HTML源碼 可用作導航頁

內容目錄一、詳細介紹二、效果展示1.部分代碼2.效果圖展示三、學習資料下載一、詳細介紹 響應式的小程序推廣單頁HTML源碼。這個設計采用了現代化的UI元素&#xff0c;包含吸引人的標題、特性展示、二維碼區域和行動號召按鈕。 二、效果展示 1.部分代碼 代碼如下&#xff0…

華為倉頡編程語言實踐體驗

華為倉頡編程語言實踐體驗 目前華為倉頡編程語言因為其推出時間較短&#xff0c;生態系統不完善。官網資料權威&#xff0c;但比較龐大難懂。快速實驗入門&#xff0c;是學習一門編程語言的法寶。網上靠譜的資料稀少&#xff0c;特此撰文介紹&#xff0c;幫助初學者減少挫折感&…

YOLOv11實戰,使用YOLOv11訓練自己的數據集和推理(附YOLOv11網絡結構圖)

2024年計算機視覺領域的顛覆性突破,YOLOv11以22%的參數量減少和0.3%的mAP提升重新定義實時目標檢測的邊界 本文將手把手帶你完成YOLOv11的全流程實戰,包含環境配置、數據準備、模型訓練、推理部署及創新優化方案,并深度解析其網絡架構設計思想。 一、YOLOv11核心創新解析 …

macOS xcode打包ios測試ipa應用包

可以參考&#xff1a; https://blog.csdn.net/sinat_34104446/article/details/133684756 過程中遇到很多稀奇古怪的報錯&#xff0c;基本重啟電腦即可解決。。。在我按照上面的步驟申請并導入新證書后&#xff0c;還遇到了一個問題&#xff1a;解決辦法&#xff1a; https://b…

STM32基礎知識學習筆記:ICODE、DCODE、DMA等常見名詞的解釋

基于AI生成內容。 ICODEICODE&#xff1a;指令總線&#xff08;Instruction Bus&#xff09; 主要用于處理 CPU 對程序指令的讀取操作。它是 STM32 存儲架構中重要的組成部分&#xff0c;與數據總線&#xff08;DCODE&#xff09;、系統總線&#xff08;System Bus&#xff09;…

誰將統治AI游戲時代?騰訊、網易、米哈游技術暗戰

游戲行業的“產能天花板”正被AI技術轟然擊穿。騰訊、網易、米哈游……所有的游戲廠商都在押注AI&#xff0c;騰訊混元發布混元游戲視覺生成平臺&#xff0c;分鐘級生成高精度游戲角色&#xff1b;網易《蛋仔派對》借AI實現UGC創作平民化&#xff1b;米哈游新作更以實時多模態對…

基于springboot的工商局商家管理系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了六年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

ABP VNext + Razor 郵件模板:動態、多租戶隔離、可版本化的郵件與通知系統

&#x1f680; ABP VNext Razor 郵件模板&#xff1a;動態、多租戶隔離、可版本化的郵件與通知系統 &#x1f4da; 目錄&#x1f680; ABP VNext Razor 郵件模板&#xff1a;動態、多租戶隔離、可版本化的郵件與通知系統&#x1f31f; 一、TL;DR&#x1f4c8; 二、系統流程圖…

瘋狂星期四第19天運營日記

網站運營第19天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今日訪問量42&#xff0c;瘋狂之后的冷靜&#xff0c;落差太大~~ 今日搜索引擎收錄情況 必應仍然是24條記錄&#xff0c;無變化 百度0收…

康養休閑旅游服務虛擬仿真實訓室:賦能人才培養的創新路徑

在康養休閑旅游行業數字化轉型與職業教育改革的雙重驅動下&#xff0c;康養休閑旅游服務虛擬仿真實訓室已成為連接課堂教學與崗位實踐的關鍵樞紐。它通過虛擬仿真技術重構康養服務場景&#xff0c;為學生打造沉浸式實踐平臺&#xff0c;在人才培養模式創新中發揮著不可替代的作…

python辦自動化--讀取郵箱中特定的郵件,并下載特定的附件

系列文章目錄 python辦公自動化–數據可視化&#xff08;pandasmatplotlib&#xff09;–生成條形圖和餅狀圖 python辦公自動化–數據可視化&#xff08;pandasmatplotlib&#xff09;–生成折線圖 python辦公自動化–數據可視化&#xff08;pandas讀取excel文件&#xff0c;m…

清理DNS緩存

Cloudflarehttps://1.1.1.1/purge-cacheGooglehttps://dns.google/cacheOpenDNShttps://cachecheck.opendns.comLinux DNS緩存sudo systemd-resolve --flush-caches 或 sudo /etc/init.d/nscd restartWindows DNS緩存ipconfig /flushdnsmacOS DNS緩存sudo dscacheutil -flushca…

用 Python 寫你的第一個爬蟲:小白也能輕松搞定數據抓取(超詳細包含最新所有Python爬蟲庫的教程)

用 Python 寫你的第一個爬蟲&#xff1a;小白也能輕松搞定數據抓取&#xff08;超詳細包含最新所有Python爬蟲庫的教程&#xff09; 摘要 本文是一篇面向爬蟲愛好者的超詳細 Python 爬蟲入門教程&#xff0c;涵蓋了從基礎到進階的所有關鍵技術點&#xff1a;使用 Requests 與…

openmv識別數字

Lenet是一種卷積識別網絡,可以用來識別打印的&#xff0c;或者是手寫的數字利用NCC的模板匹配算法來進行數字識別&#xff0c;模板匹配需要我們事先保存需要匹配的數字以及字母的模板圖片,模板匹配對于模板的大小和角度&#xff0c;有一定的要求如果數字的大小和角度有所變換&a…

一款功能全面的文體場所預約小程序

大家好?? ,我是 阿問學長!專注于分享優質開源項目解析、計算機學習資料推薦,并為同學們提供畢業設計項目指導支持,歡迎關注交流!?? 項目概述 隨著全民健身的普及,各地新建了大批體育、健身、文化娛樂場所,中小學校園的運動設施也開始對市民開放。為了合理安排主辦…

PyTorch中實現早停機制(EarlyStopping)附代碼

1. 核心目的 當模型在驗證集上的性能不再提升時&#xff0c;提前終止訓練防止過擬合&#xff0c;節省計算資源 2. 實現方法 監控驗證集指標&#xff08;如損失、準確率&#xff09;&#xff0c;設置耐心值&#xff08;Patience&#xff09; 3. 代碼&#xff1a; class EarlySto…

Nacos-服務注冊,服務發現(一)

nacos快速入手 Nacos是Spring Cloud Alibaba的組件, Spring Cloud Alibaba遵循Spring Cloud中定義的服務注冊, 服 務發現規范. 因此使?Nacos和使?Eureka對于微服務來說&#xff0c;并沒有太?區別. 主要差異在于&#xff1a; Eureka需要??搭建?個服務, Nacos不???搭…