首页 > 解决方案 > Postman - 从一个 JSON 中获取属性和值来创建另一个 JSON

问题描述

这与我这里的旧票有关!但现在我需要变得更先进。我只需要获取某些属性及其值(来自第一个响应 JSON)来创建另一个 JSON(以及一些要在新 JSON 中替换的值)。

即在下面的响应 JSON 中,我需要遍历所有“项目”(我事先不知道可以有多少),并且只获得Id + value, 和Status+value每个项目。然后构建另一个新的 JSON,其中 top 属性将被调用Products而不是Variations,并且仅包含Id+valueand Status+*NewValue*

第一个响应 JSON:

   "Variations":[  
      {  
         "ItemIds":[  
            "xxx"
         ],
         "Items":[  
            {  
               "Id":"67-V1",
               "GuId":"xxx",
               "Type":"Unit",
               "Status":"Active"
            }
         ],
         "Name":"VAR 1",
         "Id":"67-V1"
      },
      {  
         "ItemIds":[  
            "yyy"
         ],
         "Items":[  
            {  
               "Id":"67-V2",
               "GuId":"yyy",
               "Type":"Unit",
               "Status":"Active"
            }
         ],
         "Name":"VAR 2",
         "Id":"67-V2"
      },
      {  
         "ItemIds":[  
            "zzz"
         ],
         "Items":[  
            {  
               "Id":"67-V3",
               "GuId":"zzz",
               "Type":"Unit",
               "Status":"Active"
            }
         ],
         "Name":"VAR 3",
         "Id":"67-V3"
      }
   ],
   "ItemIds":[  

   ],
   "Items":[  

   ],
   "Name":"MAINP",
   "Id":"67",
   "Color":null
}

我想创建的新 JSON:

{  
   "Products":[  
      {  
               "Id":"67-V1",
               "Status":"NonActive"
      },
      {  
               "Id":"67-V2",
               "Status":"NonActive"
      },
      {  
               "Id":"67-V3",
               "Status":"NonActive"
      }
   ]
}

我制作了以下代码:

var jsonData = pm.response.json();
var newData;
var newDataGroup = "";

function replaceValues() {
    _.each(jsonData.Variations, (arrayItem) => {
        _.each(arrayItem.Items, (item) => {
            if(item.Status !== "NonActive") {
                item.Status = "NonActive";
                console.log("arrayItem " + item.Status);
            }
            newData = "{ \"Id\":\"" + item.Id + "\", " +  " \"Status\":\"" + item.Status + "\"},";
            newDataGroup = newDataGroup + newData;
        });
    });
    newDataGroup = "{ \"Products\": [ " + newDataGroup + " ] }";
}
pm.test("Run Replace", replaceValues ());
console.log("newDataGroup Final: " + newDataGroup);
var newJson = JSON.parse(newDataGroup);
console.log("newJson: " + newJson);

这是我的结果(基于上面的代码),但是如何处理最后一个,呢?

{  
   "Products":[  
      {  
               "Id":"67-V1",
               "Status":"NonActive"
      },
      {  
               "Id":"67-V2",
               "Status":"NonActive"
      },
      {  
               "Id":"67-V3",
               "Status":"NonActive"
      },
   ]
}

标签: postmanpostman-collection-runner

解决方案


似乎这里是最终的代码,可以解决问题。虽然最有可能,但不是最优雅的,但可以完成这项工作。如果有人可以提出更优雅的方式,将不胜感激。

var jsonData = pm.response.json();
var newData;
var newDataGroup = "";

function replaceValues() {
    _.each(jsonData.Variations, (arrayItem) => {
        _.each(arrayItem.Items, (item) => {
            if(item.Status !== "NonActive") {
                item.Status = "NonActive";
            }
            newData = "{ \"Id\":\"" + item.Id + "\", " +  " \"Status\":\"" + item.Status + "\"},";
            newDataGroup = newDataGroup + newData;
        });
    });
    newDataGroup = newDataGroup.slice(0, -1);
    newDataGroup = "{ \"Products\": [ " + newDataGroup + " ] }";
}
pm.test("Run Replace", replaceValues ());
var newJson = JSON.parse(newDataGroup);

推荐阅读