【问题标题】:Converting Java Object to JSON?将 Java 对象转换为 JSON?
【发布时间】:2012-08-29 02:41:35
【问题描述】:

我使用 struts2 做 Action 和 jquery 做 UI ...

我想知道如何将 Map 对象转换为 JSON 对象并将其发送回 UI,

现在可以在 JSP 页面中打印普通的 java Map 对象:

{71=Heart XXX, 76=No Heart YYY}

但我希望它是这样的:

{71:Heart XXX, 76:No Heart YYY}

我将如何实现这一目标....?

【问题讨论】:

    标签: javascript jquery json struts2


    【解决方案1】:

    要添加到 Ashish 的答案,即在添加 struts2-json-plugin 之后。

    我喜欢在可能的情况下使用 struts2-conventions-plugin,因为我的 struts.xml 中只有很少的内容,并且更喜欢使用大部分注解。

    要让您的操作在使用约定时返回 json,有两个步骤:1) 让您的操作使用 json-default 包,2) 将操作定义为具有 json 结果类型。

    JSON 注释示例

    package org.test.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    import org.apache.struts2.convention.annotation.ParentPackage;
    import org.apache.struts2.convention.annotation.Result;
    @ParentPackage("json-default")
    @Result(type = "json")
    public class JsonTest extends ActionSupport{
        private String name = "Hello World";
        private String language = "Java, I mean English";
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getLanguage() {
            return language;
        }
    
        public void setLanguage(String language) {
            this.language = language;
        }
    }
    

    有时值比原始值更复杂,您可能希望修剪返回的 json,或者有时您希望将多个操作放入一个类中(有时您会得到一个复杂的结构,并通过某些方式修剪它可以使您的在客户端上工作更容易)。为此,我们使用包含或排除参数。

    排除语言示例

    将上面的结果注解修改为:

    @Result(type = "json", params = {
        "excludeProperties",
        "language"})
    

    实现上述目标的另一种方法是明确声明我们想要的属性:

    @Result(type = "json", params = {
        "includeProperties",
        "name"})
    

    示例使用带排除参数的通配符 未提供动作代码,适合修剪复杂对象

    @Result(type = "json", params = {
        "excludeProperties",
        "punches.*.punchesCollection, *.punchesCollection.*"}) 
    

    您可以看到,使用插件比使用 xml 或注释方法更容易。

    【讨论】:

      【解决方案2】:

      我个人为此使用struts2-json 插件。它非常易于使用,您可以通过一些 struts.xml 条目轻松地将 Map 转换为 Json,反之亦然。 创建地图及其 getter/setter。

      private Map<String, String> map= new HashMap<String, String>();
      

      将全局结果定义为

       <result-type name="json" class="org.apache.struts2.json.JSONResult" default="false" />
      

      在您的struts.xml 中,并在您的会话堆栈中添加拦截器。

      <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor" />
      
      <action name="YouAction" class="YourActionClass" method="executeMethod">
               <result type="json"></result>
      </action>
      

      More documentation can be found here

      【讨论】:

        【解决方案3】:

        试试Gson:

        Gson gson = new Gson();
        String json = gson.toJson(yourMap);
        

        不过,我不建议将这种代码放入 JSP 中。像这样的东西应该存在于像 Servlet 或 Action 类这样的控制器中。

        你也绝对不希望输出是:

        {71:Heart XXX, 76:No Heart YYY}
        

        而是像正确的 JSON 一样(带引号的名称、带引号的字符串值):

        {"71":"Heart XXX", "76":"No Heart YYY"}
        

        Gson 会输出后者。

        【讨论】:

        • 谢谢...但是我已经使用它并且正在使用它...但是根据我的要求我不应该使用它你能建议任何其他方式
        • 如果您不允许使用 Gson,请查看 Jackson 甚至 json.org/java(后者非常简单且难以使用 IMO)。如果您不允许使用任何库,那么您将很难获得正确的 JSON 结构和转义。不要那样做,使用图书馆。
        【解决方案4】:

        http://www.json.org/ 上有一堆用于 Java 的 JSON 库。 我会检查其中之一。

        【讨论】:

        • 虽然这是一个有效的答案,但它应该尝试解释为什么人们会放弃内置的 struts 2 json 支持并下降到更劳动密集的低级解决方案。
        猜你喜欢
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2023-03-17
        • 1970-01-01
        相关资源
        最近更新 更多