JavaScript中解析类JSON数组字符串报错,求解决方法
解决JSON.parse解析非标准JSON字符串的问题
你提供的字符串并非标准JSON格式,直接用JSON.parse会报错,核心问题有三个:
- JSON要求所有键名和字符串值必须使用双引号,但你的字符串用了单引号
datetime.date(2024, 2, 14)不是合法的JSON值,JSON不支持这种Python风格的日期字面量- 整个数组外层被额外的双引号包裹,导致解析时被识别为单个字符串而非数组
分步修复方案
移除外层多余的双引号
原字符串最外层的"会让整个数组被当成普通字符串,先去掉:let rawStr = "[{'RK': 1, 'RN': 'CB6402AT', ...}]"; // 你的原始字符串 rawStr = rawStr.replace(/^"|"$/g, '');替换单引号为双引号
把所有单引号替换成双引号,符合JSON语法要求:rawStr = rawStr.replace(/'/g, '"');转换Python日期格式为JSON兼容的ISO日期字符串
用正则匹配datetime.date(YYYY, MM, DD)格式的内容,替换成"YYYY-MM-DD"格式的字符串:rawStr = rawStr.replace(/datetime\.date\((\d{4}), (\d{1,2}), (\d{1,2})\)/g, (match, year, month, day) => { // 补零确保月份和日期是两位 month = month.padStart(2, '0'); day = day.padStart(2, '0'); return `"${year}-${month}-${day}"`; });解析修复后的字符串
现在可以正常用JSON.parse解析了:try { const data = JSON.parse(rawStr); console.log(data); } catch (err) { console.error('解析失败:', err); }
完整代码示例
// 原始字符串 let rawStr = "\"[{'RK': 1, 'RN': 'CB6402AT', 'Marka': 'Zeleno', 'Model': 'Suzuki', 'G_PR': 1997, 'KM': 10000, 'Kupe': 'A', 'Rama': 'B', 'Dvigatel': 'C', 'Descr': datetime.date(2024, 2, 14), 'Problem': 'нагънат преден ляв калник', 'R_DATA': 'не пали', 'ime': 'Пешо', 'telefon': '0881111111'}, {'RK': 2, 'RN': 'CB8888VW', 'Marka': 'Volkswagen', 'Model': 'Passat', 'G_PR': 2001, 'KM': 500000, 'Kupe': 'D', 'Rama': 'E', 'Dvigatel': 'F', 'Descr': datetime.date(2023, 6, 8), 'Problem': 'счупен преден капак', 'R_DATA': 'не пали', 'ime': 'Гошо', 'telefon': '0882222222'}, {'RK': 3, 'RN': 'яяяяя', 'Marka': 'уу', 'Model': 'яя', 'G_PR': 111, 'KM': 1110, 'Kupe': '111', 'Rama': '11', 'Dvigatel': '1111', 'Descr': datetime.date(2025, 5, 2), 'Problem': '1111', 'R_DATA': '1111', 'ime': 'Пешо', 'telefon': '0881111111'}]\""; // 步骤1:移除外层双引号 rawStr = rawStr.replace(/^"|"$/g, ''); // 步骤2:替换单引号为双引号 rawStr = rawStr.replace(/'/g, '"'); // 步骤3:转换Python日期为ISO格式字符串 rawStr = rawStr.replace(/datetime\.date\((\d{4}), (\d{1,2}), (\d{1,2})\)/g, (_, y, m, d) => { return `"${y}-${m.padStart(2, '0')}-${d.padStart(2, '0')}"`; }); // 步骤4:解析JSON try { const parsedData = JSON.parse(rawStr); console.log('解析结果:', parsedData); } catch (error) { console.error('解析错误:', error); }
内容的提问来源于stack exchange,提问作者ViktorAlexiev
相关产品推荐
相关产品推荐

