Struts2如何返回JSON响应

13

我目前正在创建一个Web应用程序,使用户可以从数据库中获取JSON格式的标签。

这是我的Struts action:

public String execute(){


    Gson gson = new Gson();
    String tagsAsJson = gson.toJson(audioTaggingService.findTagsByName(q));
    System.out.println(tagsAsJson);

    return "success";
}

更新:

tagsAsJson 已经是 JSON 格式,我只想返回这个数据,而不是整个类操作。

它返回的结果如下所示:

这是我想要返回给用户的数据。

[{"id":2,"name":"Dubstep","description":"Dub wob wob"},{"id":3,"name":"BoysIIMen","description":"A 1990s Boy Band"},{"id":4,"name":"Sylenth1","description":"A VST Plugin for FLStudio "}]

我该如何将tagsAsJson作为JSON响应返回?因为客户端代码需要使用该JSON响应。


2
请查看此帖子http://www.mkyong.com/struts2/struts-2-and-json-example/。 - shazin
1
它将整个操作类转换为JSON。我只想要字符串作为响应,但是那个例子给了我很多异常。 - user962206
1
针对您的更新,它是以json格式呈现的,因为您手动设置了它。只需使用插件即可。如果您想要稍微多做一些工作来实现您想要的效果,那么可以使用流结果... 您还可以使用JSP输出JSON,请参见:https://dev59.com/VWox5IYBdhLWcg3wklCE 但是,真的... 只需使用插件即可。 - Quaternion
1
我有同样的问题。Struts 2甚至返回带有请求参数的整个Action类! - emeraldhieu
对于未来的访问者:预先将数据转换为JSON字符串没有太多意义;相反,使用内置的S2 JSON响应机制。只需公开要返回的数据,框架会处理其余部分。 - Dave Newton
显示剩余3条评论
4个回答

23

使用 Struts "JSON Plugin"

非常简单,只需三步:

像这样在您的maven项目中包含它即可

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-json-plugin</artifactId>
    <version>${version.struts2}</version>
</dependency>

声明你想要作为JSON字符串返回的字段,就像你操作的字段一样,提供getter和setter。

public class Struts2Action extends ActionSupport {

    private String jsonString;

    public String execute() {
        Gson gson = new Gson();
        jsonString = gson.toJson(audioTaggingService.findTagsByName(q));

        return "success";
    }

    public String getJsonString() {
        return jsonString;
    }

    public void setJsonString(String jsonString) {
        this.jsonString = jsonString;
    }
}

最后,在您的 XML 中添加此内容:

<action name="someJsonAction" class="com.something.Struts2Action">
    <result type="json">
        <param name="noCache">true</param>
        <param name="excludeNullProperties">true</param>
        <param name="root">jsonString</param>
    </result>
</action>

请注意<param name="root">jsonString</param>。这段xml告诉Struts2,该属性应被视为JSON序列化的根属性。因此,在JSON响应中仅返回命名的属性(以及如果它是映射或类似结构,则返回其以下内容)。

感谢JSON插件,内容类型将会是正确的。

"JSON插件"文档在这里:http://struts.apache.org/release/2.3.x/docs/json-plugin.html


这看起来是最好的答案。对我来说运行得很好。特别是现在json-plugin已经被Struts2作为默认库吸收了。 - Felipe Leão
这似乎在使用Struts 2.5和JSON结果时无法正常工作。我有一个与另一个库完全相同的设置,返回一个JSON字符串并尝试使用JSON结果发送它回来。当将其指向一个String属性时,我会得到net.sf.json.JSONException:java.lang.reflect.InvocationTargetException。 - Paul Zepernick
1
注意这个答案:你绝不能在单例中拥有实例字段,如果你希望它们是请求相关的。这是一种非常危险的竞态条件。 - Tyler Hoppe
@TylerHoppe 我看不到任何单例--你能解释一下吗?**注:对于普通的S2应用程序,此警告无关紧要;这里没有单例,这个答案是完全正确的(delta它正在为你做S2已经能够做的工作,这没有多大意义)。 - Dave Newton

16

尝试使用响应的PrintWriter。

Java

    public String execute()
    {
      Gson gson                    = new Gson();
      String jsonString            = gson.toJson(audioTaggingService.findTagsByName(q));
      HttpServletResponse response = ServletActionContext.getResponse();

      response.setContentType("application/json");
      response.getWriter().write(jsonString );

      return null;
   }

1
这是最正确的答案,因为他已经有了一个JSON字符串。不过,更好的方法是创建一个实际的“Result”来处理与“HttpServletResponse”的交互。 - Steven Benitez

2

在Action类中放置以下代码。

  public class Struts2Action extends ActionSupport
  {     

    public String jsonString="";

    public String execute()
    {
      Gson gson = new Gson();
      jsonString  = gson.toJson(audioTaggingService.findTagsByName(q));
      System.out.println(jsonString);

      return "success";
   }
  }

在 JSP 中添加以下代码:
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<title>Struts Rais</title>

<s:property value="jsonString"/><br />

如果你想处理JSON数据,这段代码会输出JSON数据,你可以把数据存储在<s:set>标签中,并在整个页面中访问变量。


请告诉我您是否在寻找其他内容。 - user2023812
5
如果OP正在寻找一个JSON响应,那么他们更可能不想要HTML,需要设置内容类型等。 - Dave Newton
这个程序完全正常工作。但是我有一个 ArrayList<string> jsonList; 这个列表没有数据,即使它成功执行函数。 - srinivas gowda

1
为了返回JSON响应,您需要在项目构建路径中包含struts2-json-plugin-2.x.x.jar文件。您需要设置包extends="json-default"结果类型为jsonstruts2-json-plugin-2.x.x.jar文件可将具有setter的Action类属性序列化为JSON对象。
从Maven获取jar依赖项。
  <dependencies>
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.1.8</version>
</dependency>
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-json-plugin</artifactId>
    <version>2.1.8</version>
</dependency>

你可以从这个链接获取完整的帮助... Struts 2和JSON响应

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接