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

剪贴板内容本身是纯文本,不能直接“转换成 JSON 对象”——你得先读出来,再手动解析。uni-app 没有 uni.parseClipboardData 这种 API,所有解析逻辑必须由你自己写。
uni.getClipboardData 读出来的只是字符串
调用 uni.getClipboardData 后,success 回调里的 res.data 是一个字符串,哪怕你之前复制的是 {"name":"张三"},它也还是字符串类型,不是对象。
- 不判类型直接
JSON.parse(res.data)会报错:如果剪贴板里是纯文本(比如“hello”)、HTML 片段、带换行的富文本,或格式不合法的 JSON,JSON.parse就会 throw SyntaxError - 小程序和 App 端返回的
res.data可能含不可见字符(如 iOS 自带备忘录复制时附带的零宽空格),导致JSON.parse失败 - H5 端用
navigator.clipboard.readText()读出的内容也是字符串,同样要自己 parse
怎么安全地把剪贴板字符串转成 JSON 对象
核心就一条:先校验是否为合法 JSON 字符串,再解析。别信“我复制的就是 JSON”,用户可能点错了、粘贴了别的东西。
- 用正则粗筛(快速排除明显非 JSON):
/^\s*{[\s\S]*}\s*$/.test(str) || /^\s*\[[\s\S]*]\s*$/.test(str) - 用
try...catch包裹JSON.parse,失败就 fallback 到原始字符串或空对象 - 对 iOS 剪贴板常见脏字符做清理:
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-\u200f\u202a-\u202f\ufeff]/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,每次读都要当它是不可信输入来处理。


















