【问题标题】:How to compare two JSON objects excluding the fields that are specified in a separate array?(Postman Script)如何比较两个 JSON 对象,不包括在单独数组中指定的字段?(邮递员脚本)
【发布时间】:2019-04-04 06:25:07
【问题描述】:

我有两个 JSON 对象,一个是输入,另一个是输出,我想验证输出是否与我在输入中指定的输入以及键和值相同,也不应该与我在中指定的字段进行比较一个“排除”数组。

Json Object1:(input)
{
    "name": "Sonu",
    "city": "NewYork",
    "Amount": 5000,
    "mode": "Weekly",
    "duration": "15",
    "createdCanvasAgentId": 2,
    "isActive": 1
}
Json Object2:(output)
{
    "id": 53,
    "name": "Sonu",
    "city": "NewYork",
    "Amount": 5000,
    "mode": "Weekly",
    "duration": "15",
    "qty": null,
    "createdCanvasAgentId": 2,
    "isActive": true
}

比较时我应该忽略的字段位于“排除”数组中

exclude = {"id","qty","isActive"}

代码片段如下:

//Input 
var en_val = pm.environment.get("my_array");
console.log(en_val);

keysave = Object.keys(JSON.parse(en_val));
console.log(keysave);

valuesave=Object.values(JSON.parse(en_val));
console.log(valuesave);

// Output
var resdata = JSON.parse(responseBody);
console.log(resdata);

keylist = Object.keys(resdata.data.list[0]);
console.log(keylist);

valuelist =Object.values(resdata.data.list[0]);
console.log(valuelist);

// exclude contains array of values that need not be compared
var ex=pm.environment.get("exclude");
var excludeKeys = Object.keys(JSON.parse(ex));

【问题讨论】:

    标签: javascript json object compare postman


    【解决方案1】:
    Json Object 1: keysave,valuesave
    Json Object 2: keylist,valuelist
    //values that aren't need to be checked
    exclude = ["id","qty","isActive"]
    

    代码:

     var ex1=pm.environment.get("exclude");
        var resp=[];
        for (var i in keysave)
         {    
            console.log(keysave[i]);    
            if(ex1.indexOf(keysave[i]) < 0)   
            {           
                var flag =0;        
                for (var j in keylist) 
                {       
                    if(keylist[j] === keysave[i] && valuelist[j] === valuesave[i])
                    {           
                        flag = 0;           
                        break;      
                    }       
                    else 
                    {                       
                        flag = 1;
    
                    }   
                }           
                if(flag === 0)
                {       
                    console.log("Matched value "+keysave[i]);   
                }   
                else 
                {       
                    console.log("None matched value "+keysave[i]);  
                    resp.push(keysave[i])       
                    console.log(resp);  
                }       
            }
        }
        if(resp.length > 0)
        {    
            tests[resp] = false;
        }
        else
        {    
            tests['Both JSON are Equal'] = true;
        }
    

    【讨论】:

      【解决方案2】:

      你可以利用JSON.parse(text, reviver)中的第二个参数

      reviver - 如果是函数,它规定了在返回之前如何转换最初通过解析产生的值。

      此外,您应该利用集成的 lodash 助手。

      这是一个完整的 Postman 测试示例

      const original = {
          city: 'New York'
      }
      
      const json = '{"id":10,"city":"New York","qty":5}'
      const exclude = ['id', 'qty']
      const reviverFilter = (k, v) => exclude.includes(k) ? undefined : v
      const expected = JSON.parse(json, reviverFilter)
      
      pm.test('Equals', function() {
          pm.expect(_.isEqual(original, expected)).to.be.true
      });
      

      【讨论】:

        【解决方案3】:

        也许你可以使用 lodash 中的 _.isEqual 方法?

        当两者相同时,此 _.isEqual 方法将返回 true。对于排除部分,我相信您可以在调用期间将函数作为第三个参数传递,该函数将进行检查以忽略您要忽略的属性。我建议你使用 _.includes 来处理函数内部的检查。 希望对您有所帮助..

        谢谢。

        [https://lodash.com/docs/4.17.10#isEqual] [https://lodash.com/docs/4.17.10#includes]

        【讨论】:

          【解决方案4】:

          使用要排除的键比较两个对象的自定义实现。

          var b = {
              "id": 51,
              "name": "Sonsssu",
              "city": "NewYork",
              "Amount": 5000,
              "mode": "Weekly",
              "duration": "15",
              "qty": null,
              "createdCanvasAgentId": 2,
              "isActive": true
          };
          var a = {
              "name": "Sonu",
              "city": "NewYork",
              "Amount": 5000,
              "mode": "Weekly",
              "duration": "15",
              "createdCanvasAgentId": 2,
              "isActive": 1
          };
          var exclude = ["id","qty","isActive"];
          
          function compareObject(first, second,excludeKeys) {
              var excludes = {};
              var isSame = true;
              if(excludeKeys) {
                  excludeKeys.forEach(function (key) {
                      if (!excludes.hasOwnProperty(key)) {
                          excludes[key] = 1;
                      }
                  });
              }
              Object.keys(first).forEach(function (key) {
                  if(!excludes.hasOwnProperty(key)){
                      if(first[key] !== second[key]){
                          isSame = false;
                      }
                  }
              });
              return isSame;
          }
          
          console.log(compareObject(a,b.exclude));
          

          【讨论】:

            【解决方案5】:

            你应该写一个函数将原始对象转换为临时对象,然后比较它们。

            function convertToObjectWithExcludeKeys(orginalObject, excludeKeys){
                var newObj = {};
                Object.keys(orginalObject).map(key => {
                  if(excludeKeys.indexOf(key) < 0){
                    newObj[key] = orginalObject[key];  
                  }
            
                })
                return newObj;
            }
            
            
            var b = {
                "id": 51,
                "name": "Sonsssu",
                "city": "NewYork",
                "Amount": 5000,
                "mode": "Weekly",
                "duration": "15",
                "qty": null,
                "createdCanvasAgentId": 2,
                "isActive": true
            };
            var a = {
                "name": "Sonu",
                "city": "NewYork",
                "Amount": 5000,
                "mode": "Weekly",
                "duration": "15",
                "createdCanvasAgentId": 2,
                "isActive": 1
            };
            
            var excludeKeys = ["id","qty","isActive"];
            
            //Convert original objects to temporary objects with exclude keys
            var tmpA = convertToObjectWithExcludeKeys(a, excludeKeys);
            var tmpB = convertToObjectWithExcludeKeys(b, excludeKeys);
            
            console.log("tmpA", tmpA);
            console.log("tmpB", tmpB);
            
            //Then compare them .....
            

            【讨论】:

              猜你喜欢
              • 2023-02-11
              • 1970-01-01
              • 2019-05-20
              • 1970-01-01
              • 1970-01-01
              • 2019-12-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多