必须将 JSON 对象用 JSON.stringify() 转为字符串再传给 uni.setClipboardData,因其 data 参数仅接受字符串;否则会静默失败或内容错乱,且各端表现不一:App 和小程序自动转字符串但类型丢失,H5 端根本不生效。

不能直接存 JSON 对象,必须先 JSON.stringify() 成字符串,再传给 uni.setClipboardData;否则静默失败,剪贴板里什么都不会有。
为什么不能直接传对象给 uni.setClipboardData
uni.setClipboardData 的 data 参数只接受字符串。传入 {name: "张三"}、["a", "b"] 或 null 会自动转成 [object Object]、["a","b"](看似能用但类型已失)、"",导致粘贴时内容错乱或为空。
- App 和小程序端:静默转字符串,不报错也不提示
- H5 端:
uni.setClipboardData根本不生效,必须降级到原生 API,而navigator.clipboard.writeText同样只收字符串 - 即使你后续用
uni.getClipboardData拿回来,得到的仍是原始字符串,不是自动解析好的对象
安全存储 JSON 字符串的实操步骤
存之前要确保字符串是合法、干净、可还原的 JSON:
- 用
JSON.stringify(obj)序列化,别用String(obj)或模板字面量 - 避免序列化含
undefined、function、Date等不可序列化字段的对象(会丢数据) - 若需保留时间等类型,先用
toJSON()或手动格式化,例如new Date().toISOString() - 写入前可加一层校验:
try { JSON.parse(JSON.stringify(obj)); } catch(e) { /* 拒绝写入 */ }
H5 端复制 JSON 字符串的兼容性要点
H5 不支持 uni.setClipboardData,必须自己处理降级逻辑:
- 必须在用户点击事件第一层调用,不能在
setTimeout、Promise.then或uni.getStorage回调里触发 - HTTPS 是硬要求:
navigator.clipboard.writeText在非 HTTPS 页面(包括http://192.168.x.x)直接抛NotAllowedError - 旧版 WebView(如 UC、QQ 浏览器)不支持
navigator.clipboard,得 fallback 到document.execCommand('copy'),且必须创建临时<textarea>并调用.select()和.setSelectionRange(0, txt.length) - Base64 或长 JSON 字符串(超 4000 字符)在部分安卓 WebView 中可能被截断,优先用
navigator.clipboard.writeText
读取后还原 JSON 对象的关键检查
从剪贴板读出来的是字符串,不是对象。直接 JSON.parse(res.data) 很危险:
- 先粗筛格式:
/^\s*{[\s\S]*}\s*$/.test(str) || /^\s*\[[\s\S]*]\s*$/.test(str) - 清理零宽字符:
str.replace(/[\u200b-\u200f\u202a-\u202f]/g, '')(iOS 备忘录、微信转发常带这些) - 用
try/catch包裹JSON.parse,避免 SyntaxError 崩溃 - 解析后检查结果是否为 object 或 array:
typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed) || Array.isArray(parsed)
最易被忽略的一点:iOS 首次调用 uni.getClipboardData 会弹系统授权弹窗,用户点“不允许”后,后续所有读取都返回空字符串且无重试机制——写入 JSON 字符串没问题,但读取环节完全不可控,别假设一定能拿到。


















