React/TypeScript中如何将字符串中的JS变量解析为JSON
React-Native/TypeScript 解析含特殊字符的JS键值对字符串为JSON
问题场景
你拿到的是单行无换行的字符串,由;分隔的多组键值对组成,部分值被双引号包裹,且引号内可能包含空格或;,键没有引号,无法直接用JSON.parse解析,之前的正则无法处理值内的;。
解决方案
1. 正确匹配键值对的正则
使用能区分双引号内内容的正则,避免把引号里的;当成键值对分隔符:
/([^=]+)=("(?:[^"\\]|\\.)*"|[^;]+)/g
([^=]+):匹配等号前的键(不含等号)=:匹配键值分隔符("(?:[^"\\]|\\.)*"|[^;]+):匹配值,优先匹配双引号包裹的内容(支持转义引号),其次匹配无引号的内容(直到下一个;)
2. TypeScript代码实现解析并转JSON
// 示例输入字符串 const rawData = 'SomeInfo="hello; world";AnotherKey=123;ThirdKey="foo\\"bar"'; const keyValueRegex = /([^=]+)=("(?:[^"\\]|\\.)*"|[^;]+)/g; const parsedObj: Record<string, string | number> = {}; let matchResult: RegExpExecArray | null; while ((matchResult = keyValueRegex.exec(rawData)) !== null) { // 处理键:去除前后空格 const key = matchResult[1].trim(); // 处理值 let value = matchResult[2].trim(); // 去掉值的双引号(如果有),并处理转义引号 if (value.startsWith('"') && value.endsWith('"')) { value = value.slice(1, -1).replace(/\\"/g, '"'); } // 尝试转成数字(可选,根据你的数据类型需求) else if (!isNaN(Number(value))) { value = Number(value); } parsedObj[key] = value; } // 转成标准JSON字符串 const jsonString = JSON.stringify(parsedObj); console.log(jsonString);
3. 关键逻辑说明
- 循环匹配所有键值对,避免遗漏
- 自动处理带引号的值,包括转义的双引号
- 可选的数字类型转换(如果你的值包含数字)
- 最终生成的对象可以直接用
JSON.stringify转成标准JSON,自动给键加上引号
为什么之前的正则失效?
你之前用的/([^=]+)=([^;]+)/gm会把值里的;当成键值对的分隔符,导致值被截断;而新正则优先匹配双引号内的完整内容,不会误分割。
内容的提问来源于stack exchange,提问作者dnks23
相关产品推荐
相关产品推荐

