Java 使用ApacheVelocity进行JSON到JSON的转换?有没有更好的方法来编写我在下面的一个用例中提到的模板?

Java 使用ApacheVelocity进行JSON到JSON的转换?有没有更好的方法来编写我在下面的一个用例中提到的模板?,java,velocity,Java,Velocity,我正在使用ApacheVelocity进行json转换。下面是我的json字符串 { "apiCode": "Payment Execution Service", "name": "Initiate a payment", "description": "Initiate a payment", "request": { "method": "POST", "path": "/api/v1/payments",

我正在使用ApacheVelocity进行json转换。下面是我的json字符串

    {
    "apiCode": "Payment Execution Service",
    "name": "Initiate a payment",
    "description": "Initiate a payment",
    "request": {
        "method": "POST",
        "path": "/api/v1/payments",
        "headers": [
            {
                "Corporate-ID": "apiKey"
            },
            {
                "Content-Type": "application/json"
            }
        ],
        "body": "{\n  \"beneficiaryInformation\" : {\n    \"destinationAccountIdentifier\" : \"string\",\n    \"destinationBankIdentifier\" : \"DEUTDEDB237\",\n    \"fullName\" : \"JASON SMITH\"\n  },\n  \"purposeOfPayment\" : \"Invoice Payment\",\n  \"remittanceInformation\" : \"Mantainance of Fixtures\",\n  \"remitterInformation\" : {\n    \"sourceAccountCurrency\" : \"EUR\",\n    \"sourceAccountIdentifier\" : \"string\",\n    \"sourceBankIdentifier\" : \"DEUTDEDBFRA\"\n  },\n  \"transferAmount\" : 1.5,\n  \"transferCurrency\" : \"EUR\",\n  \"transferDate\" : \"2015-07-20\",\n  \"transferType\" : \"SCTInst\",\n  \"uniqueRequestNo\" : \"string\"\n}"
    },
    "response": {
        "status": 200,
        "headers": [
            {
                "Content-Type": "application/json"
            }
        ],
        "body": "{\n  \"requestReferenceNo\" : \"string\",\n  \"transactionStatus\" : {\n    \"bankReferenceNo\" : \"string\",\n    \"reasonCode\" : \"string\",\n    \"statusCode\" : \"string\"\n  }\n}"
    },
    "provider": "Payment Execution Service"
}
下面是我的.vm文件

   {
"provider": {
    "name": "$arr[0].apiCode"
},
"consumer": {
    "name": "$arr[0].provider"
},
"interactions": [
#set($i = 0)
#foreach($a in $arr) 
{
        "description": "$a.description",
        "request": {
            "path": "$a.request.path",
            "method": "$a.request.method",
            "headers": $json.valueToString($a.request.headers),
            "body": $json.valueToString($a.request.body)
        },
        "response": {
            "headers": $json.valueToString($a.response.headers),
            "body": $json.valueToString($a.response.body),  
            "status": $a.response.status
        },
        "providerStates": [{
            "name": "$a.description"
        }]
    }
    #set($i = $i + 1)
    #if ($i < $arr.size()), #end
#end
],

"metadata": {
    "pact-jvm": {
        "version": "3.6.3"
    },
    "pactSpecification": {
        "version": "3.0.0"
    }
}
这是意料之中的

下面是我尝试过的java代码

   public String generatePACTUsingVelocity(List<ExchangeRequest> input) {
        /* first, get and initialize an engine */
        VelocityEngine ve = new VelocityEngine();
        ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
        ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
        ve.init();
        /* next, get the Template */
        Template template = ve.getTemplate("spec/pact.vm");

        StringWriter writer = new StringWriter();
        VelocityContext context = new VelocityContext();

        context.put("arr", objectToListHashMap(input));
        context.put("json", JSONStringer.class);

        template.merge(context, writer);
        return writer.toString();

    }

    @SneakyThrows
    private List<HashMap<String, Object>> objectToListHashMap(List<ExchangeRequest> input) {
        List<HashMap<String, Object>> mapList = new ArrayList<HashMap<String, Object>>();
        for (ExchangeRequest req : input) {
            JSONObject obj = new JSONObject(req);
            mapList.add(new ObjectMapper().readValue(obj.toString(), new TypeReference<HashMap<String, Object>>() {
            }));
        }
        return mapList;
    }
public String generateActionVelocity(列表输入){
/*首先,获取并初始化引擎*/
VelocityEngine ve=新的VelocityEngine();
setProperty(RuntimeConstants.RESOURCE_LOADER,“classpath”);
setProperty(“classpath.resource.loader.class”,ClasspathResourceLoader.class.getName());
ve.init();
/*接下来,获取模板*/
模板模板=ve.getTemplate(“spec/pact.vm”);
StringWriter编写器=新的StringWriter();
VelocityContext上下文=新的VelocityContext();
put(“arr”,objectToListHashMap(输入));
put(“json”,JSONStringer.class);
合并(上下文、编写器);
返回writer.toString();
}
@鬼鬼祟祟
私有列表对象ToListHashMap(列表输入){
List mapList=new ArrayList();
for(ExchangeRequest请求:输入){
JSONObject obj=新JSONObject(req);
添加(新的ObjectMapper().readValue(obj.toString(),新的TypeReference()){
}));
}
返回地图列表;
}
是否有其他方法来编写.vm模板以实现相同的输出。。我不想在模板中使用任何java类,就像我使用JSONStringer.valueToStringjson转换为字符串一样
我希望我的模板的编写方式能够使任何测试人员都可以编写并将其传递给代码以生成输出。

问题在于这一行:

JSONObject responseobj = new JSONObject(obj.get("response").toString());

您将is作为字符串放入JSONObject,这就是它以这种方式工作的原因。

不应该是
“body”:$request.body
类似
“body”:“$request.body”
“body”相同:“$response.body”
body必须从“request”中提取:“{\”方法“:\”:“GET\”,“path\”:“\”:“\/testPact\”,“body\”:{locationName\:“CHENNAI\”,\”数量\“:100,\“productName\:\“TV\”}”,必须像“body”一样放置:{“locationName:“CHENNAI”,“数量”:100,“productName:“TV”}请用“$request.body”这样的引号代替$request.bodytry,下面是生成的输出:{“提供者”:{“名称”:“sdf23e3r”},“消费者”:{“名称”:“提供者”},“交互”:[{“描述”:“API123描述”,“请求”:{“路径”:“/testPact”,“方法”:“获取”,“正文”:“{locationName=CHENNAI,数量=100,产品名称=TV}”,响应:{“标题”:{“内容类型”:“文本/纯文本;字符集=UTF-8}”,正文”:“Eureka”,“状态”:200},“providerStates”:[{“name”:“API123 description”}]}],“metadata”:{“pact jvm”:{“version”:“3.6.3”},“pactsspecification”:{“version”:“3.0.0”}}}}}请更改
JSONObject requestobj=new JSONObject(obj.get(“request”).toString()
to
JSONObject requestobj=新的JSONObject(obj.get(“请求”)
JSONObject responseobj=newjsonobject(obj.get(“response”).toString())
to
JSONObject responseobj=新的JSONObject(obj.get(“response”)那么我应该如何从“请求”中提取方法、路径和主体。。我已将请求值从字符串转换为jsonObject
JSONObject responseobj = new JSONObject(obj.get("response").toString());