空手道:如何将字符串中的 object/map 从 javascript 转换为 Java?

Karate: how to convert object/map in string from javascript to Java?

我有一个名为 production_2.json

的文件 json
[
  {
     "v":{
        "id":"rep_01564526",
        "name":"tuttoverde.pgmx",
        "type":"PRODUCTION_STARTED",
        "ute":"CDL",
        "ver":"1.0",
        "status":"EXE"
     },
     "ts":"2020-11-19T08:00:00Z"
  },
  {
     "v":{
        "id":"rep_01564526",
        "name":"tuttoverde.pgmx",
        "type":"PRODUCTION_ENDED",
        "ute":"CDL",
        "ver":"1.0",
        "status":"EXE"
        
     },
     "ts":"2020-11-19T17:00:00Z"
  }
]

并具有以下空手道代码,即:

  1. 读取文件production_2.json
  2. 并为数组的每个元素发送一个主题
I  * def sendtopics = 
     """
         function(i){
           
            var topic = "data." + machineID + ".Production";
            var payload = productions[i];
            karate.log('topic: ', topic )
            karate.log('payload: ', payload )
            return  mqtt.sendMessage(payload, topic);
            
         }
     """

    * def productions =  read('this:productions_json/production_2.json')
    * def totalProductionEvents = productions.length
    * def isTopicWasSent =  karate.repeat(totalProductionEvents, sendtopics)
    * match each isTopicWasSent == true

函数

mqtt.sendMessage(payload, topic);

是java中的一个函数,具有以下签名

public Boolean sendMessage(String payload, String topic) {

        System.out.println("Publishing message: ");
        System.out.println("payload " + payload);
        System.out.println("topic " + topic);
        return true;
      }

问题是java脚本函数中“payload”的值是正确的,并且正确打印,而在“sendMessage”函数内部,有效载荷的值格式不正确

例如,这是它在 karate.log('payload: ', payload )

中打印的内容
payload:  {
  "v": {
    "id": "rep_01564526",
    "name": "tuttoverde.pgmx",
    "type": "PRODUCTION_STARTED",
    "ute": "CDL",
    "ver": "1.0",
    "status": "EXE"
  },
  "ts": "2021-01-08T08:00:00Z"
}

而这里是 java class

的函数“sendMessage”上打印的内容
payload {v={id=rep_01564526, name=tuttoverde.pgmx, type=PRODUCTION_STARTED, ute=CDL, ver=1.0, status=EXE,  ts=2021-01-08T08:00:00Z}

我不明白为什么有效载荷的格式不正确(= 而不是 : )并且它不是字符串。我也尝试过使用以下解决方案,但它对我不起作用

 * def sendtopics = 
     """
         function(i){
           
            var topic = "data." + machineID + ".Production";
            var payload = productions[i];
            var payload2 = JSON.stringify(payload);
            return  mqtt.sendMessage(payload2, topic);
            
         }
     """

如何将 java 脚本中的对象转换为字符串以便我可以将其传递给 java?

你在空手道上做了一些非常高级的事情。我强烈建议您开始查看新版本(即将发布),您可以在此处找到详细信息:https://github.com/intuit/karate/wiki/1.0-upgrade-guide

原因是因为异步和 Java 互操作有一些重大变化 - 还有一些新的 API-s 你可以调用 JS 中的 karate 对象来做格式转换:

var temp = karate.fromString(payload);

并且 karate.log() 应该可以更好地工作,并且不会给您带来您抱怨的奇怪格式。使用当前版本,您可以尝试 karate.toJson() 如果它能为您提供您期望的转换。

鉴于您的高级用法,我建议您开始使用新版本,并就可能仍需要的任何内容提供反馈。