JSON字符串含0x0A换行符报错,自定义转义函数无效求助
解决React Native WebView输入转义JSON提交报错问题
问题核心
你遇到的'0x0A' is invalid within a JSON string错误,本质是原始输入中的换行符(ASCII 0x0A,即\n)未被正确转义为JSON要求的\\n。自定义转义函数可能没覆盖所有场景,或是转义时机不对。
修复步骤
1. 修正转义函数逻辑
确保转义函数能统一处理各类换行符及JSON特殊字符:
const escapeSpecialChars = (str) => { if (!str) return ''; return str .replace(/<br\s*\/?>/gi, '\n') // 把HTML换行转成普通换行 .replace(/\r?\n/g, '\\n') // 把普通换行转义为JSON兼容的\\n .replace(/"/g, '\\"') // 转义双引号 .replace(/\\(?![nrtbf\\"])/g, '\\\\'); // 确保已有反斜杠被正确转义 };
2. 调整转义时机
不要在editorOnChange更新状态时转义,应该在封装JSON、准备fetch提交前执行转义——状态存原始输入更便于后续编辑,提前转义会导致显示异常:
const handleSubmit = async () => { const escapedContent = escapeSpecialChars(editorContent); const payload = JSON.stringify({ content: escapedContent }); try { await fetch('你的接口地址', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: payload }); } catch (err) { console.error('提交错误:', err); } };
3. 排查隐藏控制字符
WebView的textarea可能传入不可见控制字符(比如\r,ASCII 0x0D),可以打印字符编码排查:
const editorOnChange = (content) => { Array.from(content).forEach((char, idx) => { console.log(`字符${idx}: ${char},编码: ${char.charCodeAt(0).toString(16)}`); }); setEditorContent(content); };
如果发现0x0D,在转义函数中添加.replace(/\r/g, '\\r')即可。
4. 优先使用JSON.stringify自动处理
其实无需手动写转义函数,JSON.stringify会自动处理所有JSON特殊字符,前提是传入的是原始字符串:
// 正确用法:直接传入原始状态值 const payload = JSON.stringify({ content: editorContent });
如果仍报错,说明输入已存在错误转义(比如\n未转成\\n),可先还原再处理:
const rawContent = editorContent.replace(/\\n/g, '\n'); const payload = JSON.stringify({ content: rawContent });
常见误区
- 不要手动替换
\n为\n(等于未处理),JSON要求字符串内换行必须是\\n。 - 不要在WebView的HTML中提前转义输入,否则会导致二次转义,出现
\\n变成\\\\n的问题。
内容的提问来源于stack exchange,提问作者redoc01
相关产品推荐
相关产品推荐

