【问题标题】:Getting Exception while trying to parse JSON Object from AJAX call to Java尝试从 AJAX 调用解析 JSON 对象到 Java 时出现异常
【发布时间】:2014-07-29 22:24:55
【问题描述】:

**

更新代码

**

我的 Javascript/Ajax 代码:

$(function() {
        $("#create_obd").bind("click", function(event) {

            var soNumber = [];

             $('#sales_order_lineItems input[type=checkbox]:checked').each(function(index) { 

               var row = $(this).parent().parent();
               var rowcells = row.find('td');

                var soRowData = {
                       so_number:rowcells[1].innerText
                    };
               soNumber.push(soRowData);

             }); //loop ends

            var soNumbers = JSON.stringify(soNumber);
            alert(soNumbers);
             $.ajax({
                    type: "POST",
                    url: server_ip_address + "/createobdaction",
                    data: soNumbers,
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(data){alert(data);},
                    failure: function(errMsg) {
                        alert(errMsg);
                    }
                });
            });
    });

我的 Java 代码:

package com.app.action;

import java.util.List;

import com.app.bean.SONumber;

public class CreateOBDAction {

private List<SONumber> soNumbers;

public String createOBD() {
    System.out.println(soNumbers.size());
    return "jsonCreateOBDSuccess";
}

public List<SONumber> getSoNumbers() {
    System.out.println("Getter................");
    return soNumbers;
}

public void setSoNumbers(List<SONumber> soNumbers) {
    System.out.println("Setter............");
    this.soNumbers = soNumbers;
}

}

Bean 类

package com.app.bean;

public class SONumber {

    String soNumber;

    public String getSoNumber() {
        return soNumber;
    }

    public void setSoNumber(String soNumber) {
        this.soNumber = soNumber;
    }
}

Struts.xml

<action name="createobdaction" class="com.app.action.CreateOBDAction" 
      method="createOBD">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="json">
        <param name="enableSMD">true</param>
    </interceptor-ref>       
    <result name="jsonCreateOBDSuccess" type="json" />
</action>

例外

15:32:00,092 错误 JSONInterceptor:34 - 无法反序列化 JSON 来自请求的对象 15:32:00,093 DEBUG Dispatcher:80 - 异常 在处理请求期间发生:无法反序列化 JSON 对象 来自请求 org.apache.struts2.json.JSONException: 无法 从请求中反序列化 JSON 对象 org.apache.struts2.json.JSONInterceptor.intercept(JSONInterceptor.java:117)

【问题讨论】:

    标签: javascript ajax json struts2


    【解决方案1】:
    • 在您的项目中包含Struts2-JSON-plugin
    • 为来自页面的 JSON 化对象的每个字段创建属性、getter 和 setter;
    • 将 JSON 拦截器添加到您的操作使用的拦截器堆栈中。
    • 就是这样。

    来自文档:

    如果使用拦截器,动作会从请求中的 JSON 内容填充,这些是拦截器的规则:

    1. “内容类型”必须是“应用程序/json”
    2. JSON 内容必须是 格式正确,语法见 json.org。
    3. 动作必须有公共 必须填充的字段的“setter”方法。
    4. 支持的类型 人口是:基元(int,long ... String),日期,列表,地图, 原始数组、其他类(稍后会详细介绍)和其他数组 班级。
    5. JSON 中要填充到列表中的任何对象,或 map,将是 Map 类型(从属性到值的映射),任何 整数将是 Long 类型,任何十进制数都将是类型 Double 和任何 List 类型的数组。

    【讨论】:

    • 感谢安德里亚的回复。您能否帮助我更好地理解这一点。实际上,我对此很陌生,所以可能会问非常基本的问题。我已将这三个包含在我的 Action 课程中。导入 org.json.JSONArray;导入 org.json.JSONException;导入 org.json.JSONObject;插件还需要什么?
    • 在我的 Action 类中也包含了 getter/setter。更新了上面的代码。
    • 试着让你的 SONumber 类成为标准类,而不是内部类
    • 做到了。现在得到 InstantiationException
    • @minchi 尝试将 data: soNumbers, 更改为 data: {"soNumbers" : soNumbers},
    猜你喜欢
    • 2012-05-30
    • 2018-12-17
    • 2018-03-06
    • 2023-04-09
    • 2016-09-27
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多