从 JAVA 组件获取 JSON 数据到 XWiki apache 速度

Get JSON data from JAVA component to XWiki apache velocity

从 xwiki runnung apache 中的 java 组件获取 JSON 数据的最佳方法是什么。在我的 java 我正在编译 JSON 对象和 JSON 数组的组件,我想 return 将此数据以 JSON 格式发送到我的速度脚本,这可能吗?

类似于:

{{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}}

和 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;
      }

最后我想访问这个 json 对象作为数据 return 来自 ajax 打电话。这可能吗?

我目前正在 returning 字符串,但效率很低 我如何才能 return 对象?

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

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

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

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

之后,将该映射序列化为 JSON 就完全没问题了:

$jsontool.serialize($map)

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

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

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

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

您的 Java 组件(脚本服务)总是 returns 对象到 Velocity 端(它们都在服务器上执行)。您可以选择这些对象是字符串还是任何其他数据类型。您实际上不需要处理 Java 组件中的 JSON 序列化(您只需要注意它们是 $jsontool 可以在 Velocity 上调用时处理的可序列化类型边)。在 Velocity 方面,你对这些对象做一些事情并将它们序列化到 JOSN(最后是 text/strings 因为这是 AJAX 调用所需要的,因为 JavaScript 在客户端执行侧)。

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