Nexus 脚本 return 无效 JSON
Nexus scripts doesn't return valid JSON
上下文:
我正在使用 nexus scripting API 到 return 一些数据。出于某种原因,returned 数据不符合 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 响应的内容)是:
result: { "name" : "testScript", "result" :
"{\"keyValues\":{\"firstKey\":\"firstKey\",\"secondKey\":\"secondValue\"},\"someValues\":[\"test2\",\"test3\",\"test1\"]}"
}
问题:
此响应有 2 个问题:
首先,所有转义双引号 \"
使得此响应不符合 JSON。我仍然可以使用 printf "$result"
来摆脱它们。所以结果是:
结果:
{
"name" : "test",
"result" : "{"keyValues":{"firstKey":"firstKey","secondKey":"secondValue"},"someValues":["test2","test3","test1"]}"
}
其次,结果的值总是被引用,见"result" : "{...}"
应该是"result" : {...}
。这使得它不 JSON 兼容。 returned 值似乎总是被解释为 Java/Groovy 字符串。所以我无法将 html 内容解析为 JSON 并执行 result.keyValues.firstKey
例如。
问题:
有没有办法使 returned html 响应成为有效的 JSON ,我可以在其中解析 result
?
您将 JSON 编码的字符串放入 JSON - 因此输出是预期的,当然是有效的 JSON。
如果 groovy 中处理您的 result
的任何内容无法 JSON 自行编码(例如 return listOfValues
而不是 result
),你必须忍受你得到的回应。解码响应一次,然后再次解码 response.result
。
上下文:
我正在使用 nexus scripting API 到 return 一些数据。出于某种原因,returned 数据不符合 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 响应的内容)是:
result: { "name" : "testScript", "result" : "{\"keyValues\":{\"firstKey\":\"firstKey\",\"secondKey\":\"secondValue\"},\"someValues\":[\"test2\",\"test3\",\"test1\"]}" }
问题:
此响应有 2 个问题:
首先,所有转义双引号 \"
使得此响应不符合 JSON。我仍然可以使用 printf "$result"
来摆脱它们。所以结果是:
结果:
{
"name" : "test",
"result" : "{"keyValues":{"firstKey":"firstKey","secondKey":"secondValue"},"someValues":["test2","test3","test1"]}"
}
其次,结果的值总是被引用,见"result" : "{...}"
应该是"result" : {...}
。这使得它不 JSON 兼容。 returned 值似乎总是被解释为 Java/Groovy 字符串。所以我无法将 html 内容解析为 JSON 并执行 result.keyValues.firstKey
例如。
问题:
有没有办法使 returned html 响应成为有效的 JSON ,我可以在其中解析 result
?
您将 JSON 编码的字符串放入 JSON - 因此输出是预期的,当然是有效的 JSON。
如果 groovy 中处理您的 result
的任何内容无法 JSON 自行编码(例如 return listOfValues
而不是 result
),你必须忍受你得到的回应。解码响应一次,然后再次解码 response.result
。