剪贴板内容是字符串,需先校验再安全解析为JSON对象:用正则粗筛、清理零宽字符、try-catch包裹JSON.parse,并校验解析结果类型。
剪贴板内容本身是纯文本,不能直接“转换成 JSON 对象”——你得先读出来,再手动解析。uni-app 没有 uni.parseClipboardData 这种 API,所有解析逻辑必须由你自己写。
调用 uni.getClipboardData 后,success 回调里的 res.data 是一个字符串,哪怕你之前复制的是 {"name":"张三"},它也还是字符串类型,不是对象。
JSON.parse(res.data) 会报错:如果剪贴板里是纯文本(比如“hello”)、HTML 片段、带换行的富文本,或格式不合法的 JSON,JSON.parse 就会 throw SyntaxErrorres.data 可能含不可见字符(如 iOS 自带备忘录复制时附带的零宽空格),导致 JSON.parse 失败navigator.clipboard.readText() 读出的内容也是字符串,同样要自己 parse核心就一条:先校验是否为合法 JSON 字符串,再解析。别信“我复制的就是 JSON”,用户可能点错了、粘贴了别的东西。
/^s*{[sS]*}s*$/.test(str) || /^s*[[sS]*]s*$/.test(str)
try...catch 包裹 JSON.parse,失败就 fallback 到原始字符串或空对象str.replace(/u200b|u200c|u200d|ufeff/g, '')
typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)(或允许数组)async handlePaste() {try {const res = await uni.getClipboardData();let txt = String(res.data || '').trim();// 清理零宽字符txt = txt.replace(/[u200b-u200fu202a-u202fufeff]/g, '');// 初步结构校验if (!txt || (!txt.startsWith('{') && !txt.startsWith('['))) {throw new Error('非 JSON 格式');}const parsed = JSON.parse(txt);if (typeof parsed !== 'object' || parsed === null) {throw new Error('解析结果不是对象或数组');}console.log('成功解析为 JSON:', parsed);} catch (err) {console.warn('剪贴板内容无法解析为 JSON:', err.message);// 此处可降级处理:展示原始字符串,或提示用户检查格式}}
最常被忽略的一点:你永远不知道用户上一次复制的是什么。剪贴板是共享系统资源,不是你应用的私有变量——别假设它里面一定有 JSON,每次读都要当它是不可信输入来处理。