从JAVA组件获取JSON数据到XWiki apache velocity
在xwiki runnung apache中,从java组件获取JSON数据的最佳方式是什么。在我的java中 我正在编译JSONObject和JSONArray的组件,我想返回 这些数据以JSON格式发送到我的velocity脚本,这可能吗 比如:从JAVA组件获取JSON数据到XWiki apache velocity,java,json,velocity,xwiki,Java,Json,Velocity,Xwiki,在xwiki runnung apache中,从java组件获取JSON数据的最佳方式是什么。在我的java中 我正在编译JSONObject和JSONArray的组件,我想返回 这些数据以JSON格式发送到我的velocity脚本,这可能吗 比如: {{velocity wiki="false"}} #if("$!request.outputSyntax" != '') $response.setContentType('application/json') #en
{{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对象作为从
ajax调用。这可能吗
我目前正在返回字符串,但这非常低效。我如何返回对象 在上面的代码中,Java组件返回一个
JSONObject
,但在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端。您是否尝试运行上述代码?如果是,什么时候错了?您是否尝试只返回一个Map'而不是JSONObject?
$jsontool`可能能够处理这个问题。