我们可以迭代通过json在javascript中,而不使用for..in

问题描述:

我有一个要求,如果json有效载荷包含重复键引发400错误的请求错误。我正在使用下面的代码来获取数组中的所有属性。我们可以迭代通过json在javascript中,而不使用for..in

var arrayObj = []; 
 
var attrArr = []; 
 
var arr = { 
 
    "serviceNumer": "1612045709", 
 
    "customerRefNumber": "TCreateS9", 
 
    "customerRefNumber": "TCreateS9" 
 
}; 
 
for (var key in arr) { 
 
    arrayObj.push(key, arr[key]); 
 
} 
 
console.log("arrayObj", arrayObj); 
 
for (var i = 0; i < arrayObj.length; i = i + 2) { 
 
    attrArr.push(arrayObj[i]); 
 
} 
 
console.log(attrArr);

当我重复使用for..in,重复按键得到重写。所以请用任何替代方法来帮助我。

+0

你的代码没有问题 –

+1

_“当我迭代for..in时,重复的键被覆盖“_ - 这不是for ... in循环的”错误“...当这个JSON被解析成一个对象时,你已经失去了键 - ”console.log(arr)'会告诉你。 – CBroe

+0

JSON不会直接否定重复键的存在。但是,当通过'object.key'或'object [key]'访问属性时,将返回最后一个值。 – quirimmo

您的JSON impementation不能处理重复键,

,如果你把你从JSON获得了对象,将其转换回JSON,然后比较与原始字符串中冒号的数。如果原始文件中有重复的密钥,新的JSON中将会有更少的冒号。

这样的检查适合给noobs发出警告信息,但它不是防弹的。攻击者可以在字符串值中使用冒号作为冒号,从而增加计数。如果requiremnt非常重要,则需要修改JSON解析器来执行检查。

JavaScript对象不能有重复的键。所有的钥匙都必须是唯一的。 经过以下几个环节,这会清除你的疑虑* JSObjFinding and solving issues for duplicate keys

+0

RFC 7159第4节提到重复键,但不会将它们视为语法错误。 – Jasen

+0

对不起,写了一个错误的答案,谢谢指出! – nams

你只是不知道,继续做

//you can hard code it or write it 
 
var arr = { 
 
    "serviceNumer": "1612045709", 
 
    "customerRefNumber": "TCreateS9", 
 
    "customerRefNumber": "TCreateS93333" 
 
}; 
 
//but when you call it it just will show the last element 
 
console.log(arr.customerRefNumber) 
 

 
/* 
 
its like you say 
 
var ac = 1 
 
var ac = 3 
 
console.log(ac) 
 
it will show 3 
 
*/ 
 
//make it different 
 

 
var arr2 = { 
 
    "serviceNumer": "1612045709", 
 
    "customerRefNumber": "TCreateS9", 
 
    "customerRefNumber2": "TCreateS9" 
 
}; 
 
var a = Object.getOwnPropertyNames(arr).sort() 
 
var b = Object.getOwnPropertyNames(arr2).sort() 
 
console.log(a) 
 
console.log(b)

+0

请给出比“你不知道,继续做”更好的解释,因为我不知道你的意思。 –

+0

你不能添加相同的密钥或者这意味着你不能添加相同的对象名称使其不同 – KEKUATAN

JSON对象不能有重复键。 如果您收到您的有效载荷比的字符串,你可以做以下操作:

var input = '{"serviceNumer":"1612045709","customerRefNumber":"TCreateS9","customerRefNumber":"TCreateS9"}'; 
 

 
if(input === JSON.stringify(JSON.parse(input))) 
 
    console.log("input has No Duplicate"); 
 
else 
 
    console.log("input has Duplicate");

这里JSON.parse将输入转换成JSON对象,将消除重复键

希望这对你有所帮助:)

+0

这可能有所帮助,除非输入字符串的空格(空格,制表符,换行符)与空格(空格,制表符,换行符) 'JSON.stringify()'... –

+0

这是正确的,但可以通过在比较之前从输入和分析字符串中删除所有这些空格来处理。 – Nemani

+0

'JSON。parse()'将JSON(一个字符串)转换为一个纯JavaScript对象,而不是* JSON对象*。没有像“JSON对象”那样的东西,这是一个误用。只是FYI。 –