You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:31:18