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

JavaScript中JSON字符串转对象及属性计数的优化方案问询

解决你的JSON格式修正与计数需求

嘿,我来帮你梳理下这个问题的解决方案~首先得明确:你拿到的原始text变量是语法错误的JSON字符串,这是核心问题——里面的对象没有正确转义双引号,导致标准的JSON.parse没法直接处理。不过我们可以用更靠谱的工具替代手动字符串替换,同时也有库能简化后续的计数逻辑。

一、替代手动字符串替换:用容错JSON解析库

标准JSON.parse对语法要求特别严格,根本没法直接解析这种格式乱掉的字符串,但有不少第三方库专门处理这种“不完美”的JSON:

  • json5:支持未转义引号(只要不产生歧义)、单引号、末尾逗号这些非标准语法,非常适合你这种场景。安装后这么用:

    const JSON5 = require('json5');
    const text = '["{"a1":"zxcv","a2":"pqrs","c2":[1,2,3],"a3":{"aa3":"asdfgh","aa5":null}}","{"a1":"xyz","a2":"mno","c2":[103],"a3":{"aa8":"qwerty"}}"]';
    // 先处理外层数组元素的多余引号:你的字符串里每个对象被额外双引号包着,得先去掉
    const cleanedText = text.replace(/"\{/g, '{').replace(/\}"/g, '}');
    const data = JSON5.parse(cleanedText);
    
  • dirty-json:容错性更强,专门对付各种“脏”JSON,哪怕格式错得更离谱也可能解析成功,用法类似:

    const dirtyJSON = require('dirty-json');
    const data = dirtyJSON.parse(text);
    

不过要提一句:这些容错库虽好用,但如果格式错误太严重,还是可能翻车,所以最好尽量从源头拿到格式正确的JSON,省得后续麻烦。

二、简化计数逻辑:用工具库或优化原生写法

如果你不想手动写递归遍历计数,可以用工具库简化,或者优化原生JS的写法:

1. 用Lodash快速统计

Lodash的遍历工具能帮你省不少递归代码,比如这样:

const _ = require('lodash');

function countTargetKeys(data) {
  const counts = { a1: 0, a2: 0, c2: 0, a3: 0 };
  
  _.forEach(data, item => {
    // 统计顶层的a1、a2
    if (item.a1) counts.a1++;
    if (item.a2) counts.a2++;
    
    // 统计c2的数组元素总数
    if (_.isArray(item.c2)) counts.c2 += item.c2.length;
    
    // 统计a3的子属性数量
    if (_.isPlainObject(item.a3)) counts.a3 += Object.keys(item.a3).length;
  });
  
  return counts;
}

const result = countTargetKeys(data);
console.log(result); // 输出 { a1: 2, a2: 2, c2: 4, a3: 3 }

2. 纯原生JS优化(不用任何库)

如果不想加依赖,也可以用原生JS的reduce和Object.keys优化你的手动遍历,写得更简洁些:

function countTargetKeys(items) {
  return items.reduce((acc, item) => {
    // 统计a1、a2
    if ('a1' in item) acc.a1++;
    if ('a2' in item) acc.a2++;
    
    // 统计c2数组元素个数
    if (Array.isArray(item.c2)) acc.c2 += item.c2.length;
    
    // 统计a3的子属性数量
    if (item.a3 && typeof item.a3 === 'object' && !Array.isArray(item.a3)) {
      acc.a3 += Object.keys(item.a3).length;
    }
    
    return acc;
  }, { a1: 0, a2: 0, c2: 0, a3: 0 });
}

总结一下

  • 没有原生内置函数能直接跳过格式修正解析错误的JSON,要么先修正格式,要么用容错解析库;
  • 计数部分可以用Lodash这类工具库减少代码量,也可以用原生JS的方法优化手动遍历;
  • 最省心的还是从源头获取格式正确的JSON,这样直接JSON.parse就能用,省掉格式修正的步骤。

内容的提问来源于stack exchange,提问作者srp321

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:35:13