uni-app 剪贴板内容如何转换成JSON对象

作者:袖梨 2026-08-31

剪贴板内容是字符串,需先校验再安全解析为JSON对象:用正则粗筛、清理零宽字符、try-catch包裹JSON.parse,并校验解析结果类型。

剪贴板内容本身是纯文本,不能直接“转换成 JSON 对象”——你得先读出来,再手动解析。uni-app 没有 uni.parseClipboardData 这种 API,所有解析逻辑必须由你自己写。

uni.getClipboardData 读出来的只是字符串

调用 uni.getClipboardData 后,success 回调里的 res.data 是一个字符串,哪怕你之前复制的是 {"name":"张三"},它也还是字符串类型,不是对象。

  1. 不判类型直接 JSON.parse(res.data) 会报错:如果剪贴板里是纯文本(比如“hello”)、HTML 片段、带换行的富文本,或格式不合法的 JSON,JSON.parse 就会 throw SyntaxError
  2. 小程序和 App 端返回的 res.data 可能含不可见字符(如 iOS 自带备忘录复制时附带的零宽空格),导致 JSON.parse 失败
  3. H5 端用 navigator.clipboard.readText() 读出的内容也是字符串,同样要自己 parse

怎么安全地把剪贴板字符串转成 JSON 对象

核心就一条:先校验是否为合法 JSON 字符串,再解析。别信“我复制的就是 JSON”,用户可能点错了、粘贴了别的东西。

  1. 用正则粗筛(快速排除明显非 JSON):/^s*{[sS]*}s*$/.test(str) || /^s*[[sS]*]s*$/.test(str)
  2. try...catch 包裹 JSON.parse,失败就 fallback 到原始字符串或空对象
  3. 对 iOS 剪贴板常见脏字符做清理:str.replace(/u200b|u200c|u200d|ufeff/g, '')
  4. 如果业务明确只接受对象/数组,解析后还要再判断 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,每次读都要当它是不可信输入来处理。

相关文章

精彩推荐