Ралли REST-запроса, выбрасывающее MalformedJsonException
Вопрос
Я пытаюсь запросить что-то из базы данных Rally.Сейчас я просто пытаюсь убедиться, что смогу пройти изначально.Этот код:
//create rallyrest object
RallyRestApi restApi = new RallyRestApi(new URI(hostname), username, password);
restApi.setApplicationName("QueryTest");
restApi.setWsapiVersion("v2.0");
restApi.setApplicationVersion("1.1");
System.out.println("1: So far, so good -- RallyRestApi object created");
try {
//create query request
String type = "HierarchicalRequirement";
QueryRequest qreq = new QueryRequest(type);
System.out.println("2: Still going -- Query Request Created");
//set fetch, filter, and project
qreq.setFetch(new Fetch("Name","FormattedID"));
qreq.setQueryFilter(new QueryFilter("Name", "contains", "freight"));
qreq.setProject(projectNumber);
System.out.println("3: Going strong -- Fetch, Filter, and Project set");
//create response from query********Blows up
QueryResponse resp = restApi.query(qreq);
System.out.println("4: We made it!");
} catch (Exception e) {
System.out.println("Error: " + e);
}
finally {
restApi.close();
}
}
дает мне эту ошибку:
Exception in thread "main" com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 22
at com.google.gson.JsonParser.parse(JsonParser.java:65)
at com.google.gson.JsonParser.parse(JsonParser.java:45)
at com.rallydev.rest.response.Response.<init>(Response.java:25)
at com.rallydev.rest.response.QueryResponse.<init>(QueryResponse.java:18)
at com.rallydev.rest.RallyRestApi.query(RallyRestApi.java:227)
at RQuery.main(RQuery.java:65)
Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 22
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1505)
at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1386)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:531)
at com.google.gson.stream.JsonReader.peek(JsonReader.java:414)
at com.google.gson.JsonParser.parse(JsonParser.java:60)
... 5 more
Java Result: 1
Может кто-нибудь объяснить, почему это происходит?Мой код неправильный?Если мне нужно сделать так, как предлагает ошибка, и установить Json.lenient(true), дайте мне инструкции, как это сделать с моим кодом.
Спасибо!
Решение
Ваш код работает для меня.Я не вижу ничего плохого в коде.Попробуйте другой запрос, возможно есть лишние символы.Видеть эта почта - упоминался случай с конечными символами NUL (\0).Возможно, вам нужно установить для lenient значение true, но я не знаю, как это сделать:прямого доступа к нему при работе с Rally QueryResponse нет.
Причина попробовать другой запрос заключается в том, что существуют два локальных фактора:ваша среда Java и ваши данные.MalformedJsonException указывает на неверный json, который указывает на данные.Вы получаете только «Имя» и «FormattedID», так что, скорее всего, виновник находится где-то в имени.Попробуйте другой запрос, например. (FormattedID = US123)
но выбирайте тот рассказ, в названии которого нет слова «фрахт».Установите, что хотя бы один конкретный запрос работает — это дополнительно укажет на то, что проблема действительно связана с данными, а не со средой.
Затем попробуйте тот же запрос (имя содержит слово «фрахт») непосредственно в WS API, который представляет собой интерактивный документ, в котором можно тестировать запросы.Эквивалент запроса в вашем коде также можно вставить в браузер:
https://rally1.rallydev.com/slm/webservice/v2.0/hierarchicalrequirement?workspace=https://rally1.rallydev.com/slm/webservice/v2.0/workspace/123&query=(Name%20contains%20%22fraight%22)&start=1&pagesize=200&fetch=Name,FormattedID
Обязательно замените 123 в /workspace/123
с действительным OID вашей рабочей области.
Запрос возвращается или вы видите ту же ошибку в браузере?Если запрос возвращает результат, что такое TotalResultCount?
Общее количество результатов поможет в дальнейшем устранении неполадок.Вы можете запускать свой код по одной странице за раз, и, зная TotalResultCount, можно манипулировать размером страницы, началом и ограничением, чтобы сузить ваш код до страницы, на которой существует виновная история (при условии, что виновная история существует).Вот пример:
qreq.setPageSize(200);qreq.setStart(2);qreq.setLimit(200);
Максимальный размер страницы — 200.По умолчанию — 20.Фактическое количество зависит от TotalResultCount.Начальный индекс запросов начинается с 1.Значение по умолчанию — 1.В этом примере мы начинаем со второй страницы.
Моя среда — Java SE 1.6 и эти банки:
httpcore-4.2.4.jar
httpclient-4.2.5.jar
commons-logging-1.1.1.jar
Commons-кодек-1.6.jar
gson-2.2.4.jar
ралли-rest-api-2.0.4.jar