Как читать данные JSON из URL-адреса в XPage Java Bean

66
3

Я понимаю, что, как правило, это что-то лучше сделано с JavaScript на стороне клиента. Однако CSJS не является идеальным в этой ситуации по другим причинам.

НО, если у меня есть объект Java внутри XPages. Управляемый bean может быть или что угодно. Можно ли читать информацию JSON для объекта для целей синтаксического анализа? Теоретически я хотел бы обрабатывать данные и использовать их в TypeAhead для элемента управления editbox.

Причина, по которой я заинтересован в этом, а не используя более традиционную объектную модель домино, - это скорость получения записей. Мне интересно, если представление, использующее большой параметр "startkey", быстрее, чем что-то вроде getAllEntriesByKey().

Например, это представление: http://xpagescheatsheet.com/fakenames.nsf/1fcbbeb633d9fdb3852576480057a7dc?ReadViewEntries&outputformat=JSON&StartKey=Fav

Чтобы подвести итог, я смотрю, можно ли нанести вред данным из этой ссылки в объект Java из XPages. ключ может быть любым... не обязательно быть "Fav".

Спасибо!

спросил(а) 2020-04-04T00:48:05+03:00 3 месяца назад
1
Решение
86

На вопрос 2 вопроса:

Как читать данные из URL-адреса. Здесь Оливер дал подсказку: используйте HTTP-клиент Apache (библиотеки находятся в XPages)

Как превратить этот JSON в объект Java. Здесь я бы использовал Google GSON и соответствующий объект. Клиент HTTP Apache предоставляет вам доступ к входному потоку для тела. Что-то вроде

SomeClass createFromJson(InputStream in) { Gson gson = new GsonBuilder().create(); SomeClass sc = gson.fromJson(in, SomeClass.class); return sc; }

ответил(а) 2020-04-04T01:02:05.831598+03:00 3 месяца назад
77

Я определенно поддерживаю то, что предлагает Стефан, - и я сам это делаю.

Если вы закроете Gson в плагине, вам необходимо позаботиться о безопасности и разрешениях. Я только недавно написал статью об этом (с примером, как Gson)

Однако, если вы не хотите добавлять дополнительные библиотеки в свое приложение, вы также можете использовать встроенную функциональность JSON (в пакете: com.ibm.commons.util.io.json), чтобы получить то же самое - хотя и не в такой же элегантный способ.


Вот небольшой пример:

JsonJavaFactory factory = JsonJavaFactory.instanceEx;
Object jsonObjs;
try {
String url = "http://.....";
jsonObjs = JsonParser.fromJson(factory, new BufferedReader(new InputStreamReader(new URL(url).openStream())));
for (Iterator<Object> val = factory.iterateArrayValues(jsonObjs); val.hasNext();) {
JsonJavaObject obj = (JsonJavaObject) val.next();
Double idNum = (Double) obj.getJsonProperty("id");
String id = Integer.toString(idNum.intValue());
if (StringUtil.isNotEmpty(id)) {
String name = (String) obj.getJsonProperty("name");
// Do something with id and name...
}
}
} catch (JsonException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();

/John

ответил(а) 2020-04-04T00:48:05+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема