如何读取类JSON自定义格式?解析营业时间字段报错求助
解决
formatted_opening_times解析与格式化展示问题 首先,你遇到的Uncaught SyntaxError是因为原始的formatted_opening_times根本不是合法的JSON格式——JSON要求所有键必须用双引号包裹,字符串值也要加双引号,键值对之间用逗号分隔,但你的数据里用了=>代替冒号,数字键没有引号,时间字符串也没加引号,还靠空格分隔键值对,JSON.parse自然无法识别这种非标准格式。
下面分两种最常见的情况给出解决方案:
情况1:formatted_opening_times是JavaScript对象(最可能的场景)
从你给出的原始数据来看,它更像是一个直接可访问的JS对象,而非字符串。这种情况下根本不需要JSON.parse,直接处理即可:
// 先定义数字和星期名称的对应关系(注意:这里的数字映射要和你的数据匹配,0对应周日,1对应周一,以此类推) const dayNameMapping = { 0: 'Sunday', 1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday' }; // 直接获取对象 const openingTimes = storeSpecs.data.formatted_opening_times; let displayContent = ''; // 按星期顺序排序后遍历(可选,让输出更规整) Object.keys(openingTimes) .sort((a, b) => parseInt(a) - parseInt(b)) .forEach(dayNumber => { const dayName = dayNameMapping[dayNumber]; // 每个键对应的值是数组,取第一个元素就是时间范围 const timeRange = openingTimes[dayNumber][0]; displayContent += `${dayName}: ${timeRange}<br>`; }); // 最后把displayContent插入到你需要展示的DOM元素中即可 // 比如:document.getElementById('opening-times').innerHTML = displayContent;
情况2:formatted_opening_times是原始字符串(从文件读取的非标准格式)
如果它是以非标准字符串形式存在的,那需要先把它转换成合法JSON,再解析:
// 假设原始字符串是你给出的格式 let rawOpeningTimesStr = storeSpecs.data.formatted_opening_times; // 转换为合法JSON格式 const validJsonStr = rawOpeningTimesStr .replace(/=>/g, ':') // 把=>替换为JSON标准的冒号 .replace(/\[([0-9:-]+)\]/g, '["$1"]') // 给时间字符串加上双引号 .replace(/(\d+):/g, '"$1":') // 给数字键加上双引号 .replace(/\s+(?=")/g, ', '); // 把键值对之间的空格替换为逗号 // 现在可以正常解析了 const openingTimes = JSON.parse(validJsonStr); // 之后的格式化步骤和情况1完全一致
这样处理后,你就能得到类似:
Monday: 09:00 - 22:00
Tuesday: 09:00 - 22:00
...
的展示效果了。
内容的提问来源于stack exchange,提问作者Pieter Sanders
相关产品推荐
相关产品推荐

