【问题标题】:Jacskon parser : Unrecognized token 'tieheT': was expecting 'null', 'true' or 'false'杰克逊解析:无法识别的令牌“tieheT”:期待“null”、“true”或“false”
【发布时间】:2012-11-26 13:09:10
【问题描述】:

我在通过杰克逊解析器、ajax 和 jquery 将对象数组传递给控制器​​时遇到问题。

我的控制器如下所示:

@RequestMapping(value="/saveTimeBooking")
public @ResponseBody ReturnTO saveTimeBooking(@RequestBody TimesheetTO timesheetTO[]) {
    // ...
}

我的 Java 对象 TimesheetTO 如下所示:

public class TimesheetTO implements Serializable {
    private static final long serialVersionUID = 1L;

    private int activityMasterId;
    private String name;

    private BigDecimal mondayEffort=new BigDecimal(0);
    private BigDecimal tuesdayEffort=new BigDecimal(0);
    private BigDecimal wednesdayEffort=new BigDecimal(0);
    private BigDecimal thursdayEffort=new BigDecimal(0);
    private BigDecimal fridayEffort=new BigDecimal(0);
    private BigDecimal saturdayEffort=new BigDecimal(0);
    private BigDecimal sundayEffort=new BigDecimal(0);
    public int getActivityMasterId() {
        return activityMasterId;
    }
    public String getName() {
        return name;
    }
    public BigDecimal getMondayEffort() {
        return mondayEffort;
    }
    public BigDecimal getTuesdayEffort() {
        return tuesdayEffort;
    }
    public BigDecimal getWednesdayEffort() {
        return wednesdayEffort;
    }
    public BigDecimal getThursdayEffort() {
        return thursdayEffort;
    }
    public BigDecimal getFridayEffort() {
        return fridayEffort;
    }
    public BigDecimal getSaturdayEffort() {
        return saturdayEffort;
    }
    public BigDecimal getSundayEffort() {
        return sundayEffort;
    }
    public void setActivityMasterId(int activityMasterId) {
        this.activityMasterId = activityMasterId;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setMondayEffort(BigDecimal mondayEffort) {
        this.mondayEffort = mondayEffort;
    }
    public void setTuesdayEffort(BigDecimal tuesdayEffort) {
        this.tuesdayEffort = tuesdayEffort;
    }
    public void setWednesdayEffort(BigDecimal wednesdayEffort) {
        this.wednesdayEffort = wednesdayEffort;
    }
    public void setThursdayEffort(BigDecimal thursdayEffort) {
        this.thursdayEffort = thursdayEffort;
    }
    public void setFridayEffort(BigDecimal fridayEffort) {
        this.fridayEffort = fridayEffort;
    }
    public void setSaturdayEffort(BigDecimal saturdayEffort) {
        this.saturdayEffort = saturdayEffort;
    }
    public void setSundayEffort(BigDecimal sundayEffort) {
        this.sundayEffort = sundayEffort;
    }

    public TimesheetTO(){}

    public TimesheetTO( String activityMasterId, 
                        String name, 
                        String mondayEffort,
                        String tuesdayEffort,
                        String wednesdayEffort,
                        String thursdayEffort,
                        String fridayEffort,
                        String saturdayEffort,
                        String sundayEffort)
    {
        this.activityMasterId=Integer.parseInt(activityMasterId);
        this.name=name;
        this.mondayEffort=BigDecimal.valueOf(Double.parseDouble(mondayEffort));
        this.tuesdayEffort=BigDecimal.valueOf(Double.parseDouble(tuesdayEffort));
        this.wednesdayEffort=BigDecimal.valueOf(Double.parseDouble(wednesdayEffort));
        this.thursdayEffort=BigDecimal.valueOf(Double.parseDouble(thursdayEffort));
        this.fridayEffort=BigDecimal.valueOf(Double.parseDouble(fridayEffort));
        this.saturdayEffort=BigDecimal.valueOf(Double.parseDouble(saturdayEffort));
        this.sundayEffort=BigDecimal.valueOf(Double.parseDouble(sundayEffort));
    }
}

而且,我正在使用以下 jquery 代码将时间表对象数组传递给控制器​​:

var datacounter=0;
/*var totalcount=0;*/
var timesheetTO = new Array();

$("#timeSheetTableId input[id^=activityMasterId]").each(function() {
       $('#activityMasterId_'+datacounter).removeAttr('disabled');
       $('#name_'+datacounter).removeAttr('disabled');

       timesheetTO.push({
           "activityMasterId": $('#activityMasterId_'+datacounter).val(),
           "name": $('#name_'+datacounter).val(),
           "mondayEffort": new Integer($('#mondayEffort_'+datacounter).val()),
           "tuesdayEffort": $('#tuesdayEffort_'+datacounter).val(),
           "wednesdayEffort": $('#wednesdayEffort_'+datacounter).val(),
           "thursdayEffort": $('#thursdayEffort_'+datacounter).val(),
           "fridayEffort": $('#fridayEffort_'+datacounter).val(),
           "saturdayEffort": $('#saturdayEffort_'+datacounter).val(),
           "sundayEffort": $('#sundayEffort_'+datacounter).val()
       });
       datacounter=datacounter+1;
});

var url = contextRoot + "timesheet/saveTimeBooking.htm";
$.ajax({
    type : 'POST',
    url : url,
    async : false,
    timeout : 5000,
    contentType: 'application/json',
    dataType: 'json',
    data : {
        timesheetTO : JSON.stringify(timesheetTO)
    },
    success : function(data, textStatus) {
        alert('successful');

    },
    error : function(xhr, textStatus, errorThrown) {
        alert('request failed in saving timesheet:' + errorThrown + " " + textStatus + " "
                + xhr.toString());
    }
});

在提交时,我收到上面给出的错误:Jacskon 解析器异常:无法识别的令牌 'tieheT':期待 'null'、'true' 或 'false'

我做错了什么......有什么办法可以解决这个问题吗?

这是JSON.stringify的结果:

 [{"activityMasterId":"1","name":"Financial Implications","mondayEffort":"0","tuesdayEffort":"0","wednesdayEffort":"0","thur‌​sdayEffort":"0","fridayEffort":"0","saturdayEffort":"0","sundayEffort":"0"},{"act‌​ivityMasterId":"2","name":"Cost estimation","mondayEffort":"0","tuesdayEffort":"0","wednesdayEffort":"0","thursd‌​ayEffort":"0","fridayEffort":"0","saturdayEffort":"0","sundayEffort":"0"}] 

【问题讨论】:

  • JSON.stringify(timesheetTO) 中的数据是什么样的?
  • 看起来像这样:[{"activityMasterId":"1","name":"Financial Implications","mondayEffort":"0","tuesdayEffort":"0","wednesdayEffort ":"0","thursdayEffort":"0","fridayEffort":"0","saturdayEffort":"0","sundayEffort":"0"},{"activityMasterId":"2","name ":"成本估算","mondayEffort":"0","tuesdayEffort":"0","wednesdayEffort":"0","thursdayEffort":"0","fridayEffort":"0","saturdayEffort" :"0","sundayEffort":"0"}]
  • 我在这篇帖子stackoverflow.com/questions/9726366/…(可能重复)上找到了解决方案

标签: jquery jackson


【解决方案1】:

问题是您传递的字符串值缺少引号,因此编译器需要一个布尔/空对象。

您应该通过调试验证您在运行时传递的值,如有必要,将其复制到文本编辑器中进行彻底分析。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,现在它工作正常。 问题可能是

    data : {
            timesheetTO : JSON.stringify(timesheetTO)
        }
    

    用双引号括起来

    data : {
            ' "timesheetTO" : " '+JSON.stringify(timesheetTO)+' " '
        }
    

    【讨论】:

      【解决方案3】:

      您需要验证您输入的 JSON 是否有效:错误消息表明情况并非如此。它还应该为您提供准确的行号和行号,您可以使用它们来查找输入 JSON 的问题。从消息中,我猜要么没有引用属性名称,要么没有引用某些字符串值。

      【讨论】:

        【解决方案4】:

        ajax 数据应该采用 JSON 对象的字符串。在此处查看解决方案:

        Using jQuery to post JSON object to Spring 3 controller

        【讨论】:

          【解决方案5】:

          或者,您可以使用@RestController 注释您的课程(如果还没有的话)。 那么你就不需要用@RequestBody@ResponseBody明确注释你的请求和响应了

          所以你的方法签名会变成

          @PostMapping("/saveTimeBooking")
          public ReturnTO saveTimeBooking(TimesheetTO timesheetTO[]) {
          // ...
          }
          

          【讨论】:

            猜你喜欢
            • 2018-08-04
            • 1970-01-01
            • 1970-01-01
            • 2021-08-19
            • 2012-01-14
            • 2015-09-28
            • 2023-03-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多