如何使用 Karate 框架在数组中生成 N 个对象的 JSON?
How to generate JSON with N objects in array using Karate framework?
我有下一个 json 对象:
{
"email": "api.test@cool.io",
"firstName": "John",
"lastName": "Doe",
"birthday": "1982-08-30",
"createdAt": "2015-10-02T08:23:53Z",
"gender": "male",
"businessUnit": "DE"
}
我想把它放在我名为 "udpated" 的数组中 N 次:
{ updated : [], deleted : []}
能否请您告诉我如何使用 Karate 框架执行此操作?如何以优雅的方式完成?
我试过这样的纯JS
Scenario: read json within a js function1
* def getId = function(){ return java.util.UUID.randomUUID() + '' }
* def x = read('classpath:data/user.json')
* eval
"""
var body = { updated : [], deleted : []};
var foo = function(){
var uuid = getId();
x.id = uuid;
x.email = 'api.test+' + uuid + '@cool.io';
body.updated.push(x);
body.updated.push(x);
}
foo();
karate.set('temp', body);
"""
* print temp
但结果得到的不是数组而是地图。这是我的结果:
15:58:45.580 [main] INFO com.intuit.karate - [print] {
"updated": {
"0": {
"email": "api.test+543d3448-7726-4bb3-8762-e593fb2c5435@cool.io",
"firstName": "John",
"lastName": "Doe",
"birthday": "1982-08-30",
"createdAt": "2015-10-02T08:23:53Z",
"gender": "male",
"businessUnit": "DE",
"id": "543d3448-7726-4bb3-8762-e593fb2c5435"
}
},
"deleted": {
"0": "#ref:java.util.LinkedHashMap"
}
}
看看这是否有意义。是的,JS 嵌套数组作为 JSON (Map-s) 返回时有一个烦人的边缘案例错误。您可以在此处的评论中找到一个快速修复解决方案:
只要把空手道世界中的任何东西都想象成 Java(更喜欢这个),将 JS 函数中的任何东西想象成纯 JS - 但它可以引用现有的 Java-flavoured 变量。有多种优雅的方法可以做到这一点 - 但这是我很快想到的。
* def getId = function(){ return java.util.UUID.randomUUID() + '' }
* def x = { foo: 'bar' }
* def body = { updated : [], deleted : [] };
* def fun =
"""
function() {
var uuid = getId();
x.id = uuid;
x.email = 'api.test+' + uuid + '@cool.io';
body.updated.add(x);
body.deleted.add(x);
}
"""
* eval fun()
* copy body = body
* print body
copy
删除了正确序列化的重复对象引用。
我有下一个 json 对象:
{
"email": "api.test@cool.io",
"firstName": "John",
"lastName": "Doe",
"birthday": "1982-08-30",
"createdAt": "2015-10-02T08:23:53Z",
"gender": "male",
"businessUnit": "DE"
}
我想把它放在我名为 "udpated" 的数组中 N 次:
{ updated : [], deleted : []}
能否请您告诉我如何使用 Karate 框架执行此操作?如何以优雅的方式完成?
我试过这样的纯JS
Scenario: read json within a js function1
* def getId = function(){ return java.util.UUID.randomUUID() + '' }
* def x = read('classpath:data/user.json')
* eval
"""
var body = { updated : [], deleted : []};
var foo = function(){
var uuid = getId();
x.id = uuid;
x.email = 'api.test+' + uuid + '@cool.io';
body.updated.push(x);
body.updated.push(x);
}
foo();
karate.set('temp', body);
"""
* print temp
但结果得到的不是数组而是地图。这是我的结果:
15:58:45.580 [main] INFO com.intuit.karate - [print] {
"updated": {
"0": {
"email": "api.test+543d3448-7726-4bb3-8762-e593fb2c5435@cool.io",
"firstName": "John",
"lastName": "Doe",
"birthday": "1982-08-30",
"createdAt": "2015-10-02T08:23:53Z",
"gender": "male",
"businessUnit": "DE",
"id": "543d3448-7726-4bb3-8762-e593fb2c5435"
}
},
"deleted": {
"0": "#ref:java.util.LinkedHashMap"
}
}
看看这是否有意义。是的,JS 嵌套数组作为 JSON (Map-s) 返回时有一个烦人的边缘案例错误。您可以在此处的评论中找到一个快速修复解决方案:
只要把空手道世界中的任何东西都想象成 Java(更喜欢这个),将 JS 函数中的任何东西想象成纯 JS - 但它可以引用现有的 Java-flavoured 变量。有多种优雅的方法可以做到这一点 - 但这是我很快想到的。
* def getId = function(){ return java.util.UUID.randomUUID() + '' }
* def x = { foo: 'bar' }
* def body = { updated : [], deleted : [] };
* def fun =
"""
function() {
var uuid = getId();
x.id = uuid;
x.email = 'api.test+' + uuid + '@cool.io';
body.updated.add(x);
body.deleted.add(x);
}
"""
* eval fun()
* copy body = body
* print body
copy
删除了正确序列化的重复对象引用。