我正在构建一个应用程序,该应用程序基于我从 API 获取的数据,其格式与 json_encode() 函数的响应类似。现在,我不知道(我知道这是可能的)该 API 时不时地返回重复的键。由于修复重复键不是我的站点,因此我必须找到一种解决方案,如何将此响应解析为包含发送给我的所有数据的可用数组。 我想通过在键中添加“x01”、“x02”、“x03”...来重命名重复的键。 到目前为止,我找到了一种可以提供帮助的解决方案( here ),但我觉得它仅适用于更简单的数组 - 我处理嵌套数组。 因此,这是一个演示 API 响应:
{"boss":"mike",
"employees":{
"Josh":{
"active":"1",
"hours":"12",
"name":"Josh"},
"Josh":{
"active":"1",
"hours":"3",
"name":"Josh"}
}
}
因此,如您所见,几乎整个“Josh”键都是重复的(“hours”子键除外)。尽管它看起来像是一个错误,但这两个值对我来说都很重要。 所以,这是我想要获得的数组:
array (
"boss" => "mike",
"employees" = array (
"x01Josh" = array ("active" => "1", "hours" => "12", "name" => "Josh")
"x02Josh" = array ("active" => "1", "hours" => "3", "name" => "Josh")
)
)
我有一个想法,甚至一次检查一个单词是否是字符串、双引号、逗号或任何大括号,并相应地构建一个函数。我认为这将需要很长且低效的代码(处理速度很慢)。
由于我是正则表达式的新手,并且由于我也没有找到解决方案(我确信它存在,但我没有找到它),所以我向您寻求帮助。
我计划用 JavaScript/jQuery 或 PHP 解析它(使用另一个 JSON 请求)。 提前致谢。
更新我忘了提及 - 我这样做的原因是因为第二个键覆盖了第一个键(重复)。另外,我无法更改 API(这不是我网站的 API)。我已经要求他们针对这些问题实现一些更改,但与此同时,我必须从我这边做这件事。
最佳答案
使用String.replace
、String.match
、Array.filter
和的JS解决方案Array.shift
函数:
var jsonData = '{"boss":"mike","employees":{"Josh":{"active":"1","hours":"12","name":"Josh"},"Josh":{"active":"1","hours":"3","name":"Josh"}}}',
re = /\"(\w+?)(?=\":\{)/g, names = {}, dups;
jsonData.match(re).forEach(function(v){
v = v.replace(/\"/, "");
(!names[v])? names[v] = 1 : names[v]++;
});
dups = Object.keys(names).filter(function(k) { return names[k] > 1; }); // getting duplicated keys
dups.forEach(function (k) {
var count = names[k], i;
names[k] = [];
for (i = 0; i < count; i++) {
names[k].push("x0" + (i+1));
}
});
jsonData = jsonData.replace(re, function (p1) { // replacing duplicate keys
p1 = p1.substr(1);
if (dups.indexOf(p1) !== -1) {
return '"' + names[p1].shift() + p1;
} else {
return '"' + p1;
}
});
console.log(JSON.parse(jsonData));
关于javascript - 解析具有重复键的嵌套 JSON 对象(PHP 或 JS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38992106/