如何从URL读取JSON数据到XPage Java Bean

时间:2015-10-07 22:40:58

标签: java xpages

我知道这通常使用Client Side JavaScript做得更好。然而,出于其他原因,CSJS在这种情况下并不理想。

但是如果我在XPage中有一个Java对象。托管bean可能或其他什么。是否可以将JSON信息读入对象以进行解析?从理论上讲,我想要处理数据并在TypeAhead中使用它来进行编辑框控件。

我对此感兴趣而不是使用更传统的多米诺骨牌对象模型的原因是获得条目的速度。我想知道使用伟大的“startkey”参数的视图是否比getAllEntriesByKey()更快。

例如这个观点: http://xpagescheatsheet.com/fakenames.nsf/1fcbbeb633d9fdb3852576480057a7dc?ReadViewEntries&outputformat=JSON&StartKey=Fav

总结一下,我想看看是否有可能将来自该链接的数据从XPages中压入Java对象。关键可以是任何东西......不一定是“Fav”。

谢谢!

2 个答案:

答案 0 :(得分:4)

问题分为两部分:

  1. 如何从URL读取数据。在这里,Oliver提供了提示:使用Apache HTTP客户端(库是XPages中的)
  2. 如何将JSON转换为Java对象。在这里,我将使用Google GSON和匹配的对象。 Apache HTTP客户端允许您访问正文的输入流。像

    这样的东西

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

答案 1 :(得分:3)

我绝对支持Stefan建议的方式 - 而且我自己这样做。

如果您将Gson包装在插件中,则需要注意安全性和权限。我刚刚写了article about exactly这个(以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();

/约翰