如何使用原生JavaScript解析JSON并循环提取多对象用户名
解决重复键JSON的解析与遍历问题
你遇到的核心问题是JSON规范不允许重复键名,所以JSON.parse会自动覆盖前面的sec对象,只保留最后一个。要实现遍历所有sec对象的需求,我们需要先修正原始JSON字符串的结构,把重复的sec键转为数组形式,再进行解析和处理。
步骤1:修正JSON字符串结构
我们可以用正则表达式替换,把多个独立的sec对象包装成一个数组(比如命名为secs):
var JSONobj = `{ "sec" : { "username" : "ac12", "location" : "Indian Ocean", "online" : true }, "sec" : { "username" : "gg66", "location" : "Pacific Ocean", "online" : false }, "sec" : { "username" : "test123", "location" : "Atlantic Ocean", "online" : false } }`; // 修正结构:将重复的sec键转为数组 var correctedJsonStr = JSONobj // 把开头的"{ "sec" : {"替换为"{ "secs" : [" .replace(/^\{\s*"sec"\s*:/, '{ "secs" : [') // 把所有中间的", "sec" : {"替换为", " .replace(/,\s*"sec"\s*:/g, ', ') // 把结尾的"}"替换为"]}" .replace(/\s*\}$/, ' ]}');
步骤2:解析并遍历提取数据
修正后的JSON结构是有效的,现在可以正常解析并遍历数组提取username:
// 解析修正后的JSON var obj = JSON.parse(correctedJsonStr); // 遍历secs数组,提取每个对象的username obj.secs.forEach(secItem => { console.log(`Sec - username = ${secItem.username}`); });
运行结果
执行后控制台会输出:
Sec - username = ac12 Sec - username = gg66 Sec - username = test123
注意事项
- 这个正则替换是针对你提供的JSON格式编写的,如果原始JSON的空白字符、键名格式有变化,可能需要微调正则表达式。
- 如果你能控制JSON的生成端,最好直接生成数组格式的JSON(比如一开始就用
"secs": [{}, {}, {}]),这比事后修正更可靠。
内容的提问来源于stack exchange,提问作者Sylv99
相关产品推荐
相关产品推荐

