Скрипты Nexus не возвращают действительные JSON - PullRequest
0 голосов
/ 11 февраля 2020

Контекст:

Я использую API сценариев Nexus для возврата некоторых данных. По некоторым причинам возвращаемые данные не соответствуют JSON. Я на Nexus PRO 3.20.1-01. Я не уверен, если это проблема с Nexus или моим сценарием.

Вот тестируемый образец Groovy, который можно развернуть на нексусе (скрипт называется 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", чтобы избавиться от них. Таким образом, результатом будет: result:

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

Во-вторых, значение результата всегда указывается в кавычках, см. "result" : "{...}", где оно должно быть "result" : {...}. Что делает его не JSON совместимым. Кажется, что возвращаемое значение всегда интерпретируется как строка Java / Groovy. Поэтому я не могу проанализировать содержимое html как JSON и выполнить, например, result.keyValues.firstKey.

Вопрос:

Есть ли способ сделать возвращенный ответ html a действительный JSON где я могу разобрать result?

1 Ответ

1 голос
/ 11 февраля 2020

Вы помещаете закодированную строку JSON внутрь JSON - так что результат ожидается и, конечно, действителен JSON.

Если что-либо, имеющее дело с вашим result из groovy, не может JSON кодировать его само (например, вернуть listOfValues вместо result), вам придется согласиться с полученным ответом , Декодируйте ответ один раз, а затем снова декодируйте response.result.

...