Javascript 如何比较两个行位置和索引不同的JSON
我有一个JSON文件,我想比较两个值,确保两个JSON具有相同的值,并返回TRUE。如果有任何一个值不可用,那么我需要立即返回FALSE 问题是现在我有两个JSON文件,它们的值相同,但行位置不同 JSON_1:Javascript 如何比较两个行位置和索引不同的JSON,javascript,node.js,json,Javascript,Node.js,Json,我有一个JSON文件,我想比较两个值,确保两个JSON具有相同的值,并返回TRUE。如果有任何一个值不可用,那么我需要立即返回FALSE 问题是现在我有两个JSON文件,它们的值相同,但行位置不同 JSON_1: { "sqlQuery": "select type,subtype from wetrade_p2 where parent_id='69341269'", "message": "2 rows s
{
"sqlQuery": "select type,subtype from wetrade_p2 where parent_id='69341269'",
"message": "2 rows selected",
"row": [
{
"column": [
{
"value": "W",
"name": "TYPE"
},
{
"value": "P",
"name": "STATUS"
},
{
"value": "0",
"name": "SUBTYPE"
},
{
"value": "USD",
"name": "CURRENCY"
}
]
},
{
"column": [
{
"value": "W",
"name": "TYPE"
},
{
"value": "S",
"name": "STATUS"
},
{
"value": "0",
"name": "SUBTYPE"
},
{
"value": "USD",
"name": "CURRENCY"
}
]
}
]
}
JSON_2:
{
"sqlQuery": "select type,subtype from wetrade_p2 where parent_id='69341269'",
"message": "2 rows selected",
"row": [
{
"column": [
{
"value": "W",
"name": "TYPE"
},
{
"value": "S",
"name": "STATUS"
},
{
"value": "0",
"name": "SUBTYPE"
},
{
"value": "USD",
"name": "CURRENCY"
}
]
},
{
"column": [
{
"value": "W",
"name": "TYPE"
},
{
"value": "P",
"name": "STATUS"
},
{
"value": "0",
"name": "SUBTYPE"
},
{
"value": "USD",
"name": "CURRENCY"
}
]
}
]
}
如果您检查上述JSON_1和JSON_2,并且两者都具有相同的值,但行不匹配/JSON对象顺序不一致。因此,即使值相同,下面的代码也返回FALSE:
代码:
compareActualAndExpectedResponse:function (jsonActual,jsonExpected) {
var jsonObject1 = JSON.parse(jsonActual);
var jsonObject2 = JSON.parse(jsonExpected);
var keys = Object.keys(jsonObject1);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (jsonObject1[key] != jsonObject2[key]) {
console.log(key + " value changed from '" + jsonObject1[key] + "' to '" + jsonObject2[key] + "'");
return false;
}
}
return true;
}
var methods = {
getuuid:function () {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
},
compareActualAndExpectedResponse:function (jsonActual, jsonExpected) {
if (Object.prototype.toString.call(jsonActual) !==
Object.prototype.toString.call(jsonExpected)) {
console.log("false 1");
return false;
}
if (Array.isArray(jsonActual)) {
if (jsonActual.length !== jsonExpected.length) {
console.log("false 2")
return false;
}
let i = jsonActual.length;
while (i--) {
let j = jsonExpected.length;
let found = false;
while (!found && j--) {
if (compareActualAndExpectedResponse(jsonActual[i], jsonExpected[j])) found = true;
}
if (!found) {
console.log("false 3");
return false;
}
}
console.log("true 1")
return true;
}
if (Object.prototype.toString.call(jsonActual) === '[object Object]') {
for (const key in jsonActual) {
if (Object.prototype.hasOwnProperty.call(jsonActual, key)) {
if (!Object.prototype.hasOwnProperty.call(jsonExpected, key)) {
console.log("false 4");
return false;
}
if (!compareActualAndExpectedResponse(jsonActual[key], jsonExpected[key])) {
console.log("false 5")
return false;
}
}
}
for (const key in jsonExpected) {
if (Object.prototype.hasOwnProperty.call(jsonExpected, key) &&
!Object.prototype.hasOwnProperty.call(jsonActual, key)) {
console.log("false 6")
return false;
}
}
console.log("true 2")
return true;
}
return jsonActual === jsonExpected;
}
};
module.exports = methods;
客户端.JS:
var utils = require('./Utils');
if(key.includes("entireJSONResponse"))
{
var data=fs.readFileSync(global.path+"/validationJSON/JSONResponseValidator/Bank.json",'utf8')
data=data.replace("{buyer}",transresult.get("buyeraccountnumber"));
const expected=JSON.stringify(transresult.get(key),null,4);
console.log(expected)
console.log(data);
var validationResult=utils .compareActualAndExpectedResponse(data,expected);
console.log(validationResult); //Still return false
console.log(utils.compareActualAndExpectedResponse(dataFinal,expected));
console.log("*************************************")
}
我最近解决了一个类似的问题。 这是我使用的代码,适用于您的用例
函数compareActualAndExpectedResponse(jsonActual,jsonExpected){
if(Object.prototype.toString.call(jsonActual)==
Object.prototype.toString.call(jsonExpected)){
返回false;
}
if(Array.isArray(jsonActual)){
if(jsonActual.length!==jsonExpected.length){
返回false;
}
设i=j实际长度;
而(我--){
设j=jsonExpected.length;
让发现=错误;
而(!found&&j--){
如果(compareActualAndExpectedResponse(jsonActual[i],jsonExpected[j])发现=true;
}
如果(!找到){
返回false;
}
}
返回true;
}
if(Object.prototype.toString.call(jsonActual)='[Object-Object]'){
for(jsonActual中的常量键){
if(Object.prototype.hasOwnProperty.call(jsonActual,key)){
if(!Object.prototype.hasOwnProperty.call(jsonExpected,key)){
返回false;
}
如果(!compareActualAndExpectedResponse(jsonActual[key],jsonExpected[key])){
返回false;
}
}
}
for(jsonExpected中的常量键){
if(Object.prototype.hasOwnProperty.call(jsonExpected,key)&&
!Object.prototype.hasOwnProperty.call(jsonActual,key)){
返回false;
}
}
返回true;
}
返回jsonActual==jsoneexpected;
}
常量JSON_1={
sqlQuery:“从wetrade_p2中选择类型,子类型,其中父级_id='69341269',
消息:“已选择2行”,
行:[{
专栏:[{
值:“W”,
名称:'类型',
},
{
值:“P”,
名称:'状态',
},
{
值:“0”,
名称:'子类型',
},
{
价值:'美元',
名称:'货币',
},
],
},
{
专栏:[{
值:“W”,
名称:'类型',
},
{
值:“S”,
名称:'状态',
},
{
值:“0”,
名称:'子类型',
},
{
价值:'美元',
名称:'货币',
},
],
},
],
};
常量JSON_2={
sqlQuery:“从wetrade_p2中选择类型,子类型,其中父级_id='69341269',
消息:“已选择2行”,
行:[{
专栏:[{
值:“W”,
名称:'类型',
},
{
值:“S”,
名称:'状态',
},
{
值:“0”,
名称:'子类型',
},
{
价值:'美元',
名称:'货币',
},
],
},
{
专栏:[{
值:“W”,
名称:'类型',
},
{
值:“P”,
名称:'状态',
},
{
值:“0”,
名称:'子类型',
},
{
价值:'美元',
名称:'货币',
},
],
},
],
};
log(compareActualAndExpectedResponse(JSON_1,JSON_2))函数中的code>即使位置相同,结果也将是false
,因为对象是通过引用进行比较的jsonObject1[key]!=jsonObject2[key]
我不理解这个问题。这些值不一样。这两个json的状态值不同
需要比较两个json_1和json_2。json对象的顺序将不会保持不变。但是,如果您检查json_1和json_2中的数据,它们将是相同的。希望能有帮助。非常感谢。。让我检查一下,并告诉你最新情况。。!!!您可以共享JSFIDLE吗?这样我就可以使用我拥有的不同有效负载进行检查这里有一个repl.it链接,@ArrchanaMohan代码将比较两个JSON对象是否相等,它忽略了数组元素的显示顺序。你能提供一个没有给出预期结果的例子吗?我已经用你在问题中给出的例子说明了,它返回true,最后它起作用了。。我需要解析JSON并创建一个变量,然后需要将其传递给函数。非常感谢你。。你节省了一天的时间…这对你很有帮助。接受你的回答