自定义JSON解析器逻辑问题求助:字符串与数值读取异常
修复自定义JSON解析器的两个核心问题
问题分析
你的解析器存在两个核心逻辑错误:
- 字符串读取失败:代码中判断字符串用了
"(HTML实体),但实际JSON里的字符串是用双引号"包裹的,匹配逻辑完全错误。 - 数值读取连带
}:parseObject中截取value字符串时,错误地将commaIndex!==-1的情况下的结束位置设为colonIndex,导致无法正确截取到逗号或结尾的位置,最后读取到了闭合的}。
修复后的完整代码
function customJSONParse(jsonString){ const sanitizedString = jsonString.replace(/\s/g, ''); if(sanitizedString[0]==='{'){ return parseObject(sanitizedString); }else if(sanitizedString[0]==='['){ return parseArray(sanitizedString); }else{ throw new SyntaxError('Unexpected token'); } } function parseObject(jsonString){ const object={}; let key; let value; let startIndex=1; while(jsonString[startIndex]!=='}'){ // 定位key的双引号边界,提取纯key内容 const keyStartIndex = jsonString.indexOf('"', startIndex); const keyEndIndex = jsonString.indexOf('"', keyStartIndex + 1); key = jsonString.substring(keyStartIndex + 1, keyEndIndex); // 从key结束位置开始找冒号 const colonIndex = jsonString.indexOf(':', keyEndIndex); // 确定value的结束位置:优先取逗号,没有则取闭合花括号 const commaIndex = jsonString.indexOf(',', colonIndex); const braceEndIndex = jsonString.indexOf('}', colonIndex); const valueEndIndex = (commaIndex !== -1 && commaIndex < braceEndIndex) ? commaIndex : braceEndIndex; const valueString = jsonString.slice(colonIndex + 1, valueEndIndex); value = parseValue(valueString); object[key] = value; // 更新循环起始位置,处理下一组键值对或结束循环 startIndex = commaIndex !== -1 ? commaIndex + 1 : braceEndIndex; } return object; } function parseValue(valueString){ if(valueString==='true'){ return true; }else if(valueString==='false'){ return false; }else if(valueString==='null'){ return null; } // 先判断字符串类型(双引号开头) else if(valueString[0]==='"'){ return valueString.slice(1, -1); } // 严谨判断数值:排除空字符串、Infinity等无效情况 else if(!isNaN(parseFloat(valueString)) && isFinite(valueString)){ return parseFloat(valueString); } else{ throw new SyntaxError('Unexpected Token'); } } // 测试验证 console.log(customJSONParse('{"name":"John","age": 30}')); // 输出:{ name: 'John', age: 30 }
关键修复点说明
- 修正字符串匹配逻辑:去掉错误的HTML实体匹配,改为直接处理JSON标准的双引号
",同时通过定位双引号边界正确提取key和字符串value。 - 修复value截取范围:通过对比逗号和闭合花括号的位置,精准确定value的结束点,避免读取到多余的
}。 - 优化数值判断顺序:先判断字符串再判断数值,避免字符串被误判为数字;同时用更严谨的条件筛选有效数值,排除空字符串、无穷值等异常情况。
内容的提问来源于stack exchange,提问作者Kumar_Maddy
相关产品推荐
相关产品推荐

