尝试将JSON对象从AJAX调用解析为Java时获取异常

时间:2014-06-09 11:22:56

标签: javascript ajax json struts2

**

更新代码

**

我的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 ERROR 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)

1 个答案:

答案 0 :(得分:0)

  • 在项目中加入Struts2-JSON-plugin;
  • 为来自页面的JSONized对象的每个字段创建属性,getter和setter;
  • 将JSON拦截器添加到您的操作使用的拦截器堆栈中。
  • 那就是它。

来自文档:

  

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

     
      
  1. &#34;内容类型&#34;必须是&#34; application / json&#34;
  2.   
  3. JSON内容必须是   格式良好,请参阅json.org的语法。
  4.   
  5. 行动必须公开   &#34;设定器&#34;必须填充的字段的方法。
  6.   
  7. 支持的类型   人口是:Primitives(int,long ... String),Date,List,Map,   原始数组,其他类(稍后详细介绍)和其他数组   类。
  8.   
  9. JSON中的任何对象,即要在列表中填充,或者是   map,将是Map类型(从属性映射到值),any   整数将是Long类型,任何十进制数都是类型   Double,以及List类型的任何数组。
  10.