0

What is the best way to get JSON data from a java component in xwiki runnung apache. In my java component I'm compiling JSONObjects and JSONArrays, I would like to return this data to my velocity script in JSON format, is this possible?

something like:

{{velocity wiki="false"}}
    #if("$!request.outputSyntax" != '')
      $response.setContentType('application/json')
    #end
    #set($map = {})
    #set ($rightIN =  ${request.rightIN})
    #set ($spacenameIN =  ${request.spacenameIN})
#set($disgard =$map.add($services.getjsondata.javacomp($spacenameIN,$rightIN)))
    $jsontool.serialize($map)
 {{/velocity}}

and the Java:

      public JSONObject javacomp(String spacenameIN, String rightIN ){
              JSONObject obj = new JSONObject();
              try {
                    obj.put("spacenameIN ", spacenameIN );
                    obj.put("rightIN", rightIN );
            } catch (JSONException e) {
                    e.printStackTrace();
            }
              return obj;
      }

At the end I would like to access this json object as a data return from an ajax call. Is this possible?

I'm currently returning strings, but this is very inefficient how can I return objects?

4

1 回答 1

0

在上面的代码中,Java 组件返回 aJSONObject但是,在 Velocity 中,您尝试将该对象直接添加到地图中,而不是指定任何键。

因此,您的速度代码应更改为:

#set ($map = $services.getjsondata.javacomp($spacenameIN, $rightIN))

...因为该JSONObject实例几乎是一张地图。

之后,可以使用以下命令将该映射序列化为 JSON:

$jsontool.serialize($map)

最后,我想访问这个 json 对象作为 ajax 调用的数据返回。这可能吗?

当然,请记住还要在 Velocity 中设置结果的内容类型,以便您的 ajax 调用正确地将 Velocity 结果解释为 JSON,而不是常规文本。为此,您需要执行以下操作:

#set ($discard = $response.setContentType('application/json'))

我目前正在返回字符串,但这非常低效如何返回对象?

您的 Java 组件(脚本服务)总是将对象返回到 Velocity 端(它们都在服务器上执行)。如果这些对象是字符串或任何其他数据类型,这是您的选择。您实际上并不需要在 Java 组件中处理 JSON 序列化(您只需要注意它们是可序列化的类型,$jsontool可以在 Velocity 端调用它时进行处理)。在 Velocity 方面,您对这些对象执行某些操作并将它们序列化为 JOSN(最后是文本/字符串,因为这是 AJAX 调用所需要的,因为 JavaScript 在客户端执行)。

此外,我建议您JSONObject完全避免并使用常规Map将您的结果传递给 Velocity 方面。

于 2016-03-07T20:20:53.977 回答