首页 > 解决方案 > Nexus 脚本不返回有效的 JSON

问题描述

语境:

我正在使用nexus 脚本 API返回一些数据。出于某种原因,返回的数据不符合 JSON。我在 nexus PRO 3.20.1-01 上。我不确定这是否是 Nexus 或我的脚本的问题。

这是一个可测试的 Groovy 示例,可在 nexus 上部署(脚本称为testScript.groovy

import groovy.json.JsonOutput;

Map listOfValues = new HashMap<>();
HashSet<String> values = new HashSet<String>();
values.add('test1');
values.add('test2');
values.add('test3');

listOfValues.put('someValues',values);

Map<String, String> keyValues = new HashMap<>();
keyValues.put('firstKey','firstKey');
keyValues.put('secondKey','secondValue');

listOfValues.put('keyValues',keyValues);

result = JsonOutput.toJson(listOfValues);
return result;

(我知道我在 Groovy 中不需要;,但目前我不能这样做)

我用它来称呼它:

result=$(curl --noproxy $NO_PROXY --insecure -u $NEXUS_USERNAME:$NEXUS_PASSWORD -X POST --header 'Content-Type: application/json' $NEXUS_SCRIPT_ENDPOINT/test/run)
echo 'result:'
echo $result

结果(http响应的内容)是:

结果:{“名称”:“testScript”,“结果”:“{\”keyValues\”:{\“firstKey\”:\“firstKey\”,\“secondKey\”:\“secondValue\”},\ "someValues\":[\"test2\",\"test3\",\"test1\"]}" }


问题:

此响应有两个问题:

首先,所有转义的双引号\"使此响应不符合 JSON 标准。我仍然可以printf "$result"用来摆脱它们。所以结果是: 结果:

{
  "name" : "test",
  "result" : "{"keyValues":{"firstKey":"firstKey","secondKey":"secondValue"},"someValues":["test2","test3","test1"]}"
}

其次, result 的值总是被引用,看"result" : "{...}"它应该在哪里"result" : {...}。这使得它不符合 JSON。似乎返回的值总是被解释为 Java/Groovy 字符串。因此,我无法将 html 内容解析为 JSON,result.keyValues.firstKey例如。

问题:

有没有办法让返回的 html 响应成为我可以解析的有效 JSON result

标签: jsongroovynexusnexus3

解决方案


您将 JSON 编码的字符串放入 JSON 中 - 因此输出是预期的,当然是有效的 JSON。

如果处理你resultfrom groovy 的任何东西都不能对它本身进行 JSON 编码(例如 returnlistOfValues而不是result),你必须忍受你得到的响应。将响应解码一次,然后response.result再次解码。


推荐阅读