在 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不⽤⾃⼰搭…