Gson无法识别嵌套的JSON对象

时间:2017-12-10 06:15:06

标签: java gson

我尝试向我的servlet发出以下POST请求:

$.post('SubmitDashboardInfo/reimbursementRequest',
          {
                startDate       : $('#startDate').val().trim(),
                endDate         : $('#endDate').val().trim(),
                expenseType     : $('#expenseType').val().trim(),
                eventDescription: $('#eventDescription').val().trim(),
                eventCost       : $('#eventCost').val().trim(),
                location        : {
                    streetAddress     : $('#streetAddress').val().trim(),
                    city              : $('#city').val().trim(),
                    stateAbbreviation : $('#state').val().trim(),
                    zipCode           : $('#zipCode').val().trim()
                }/*,
                gradeScale      : $.makeArray($('#gradeScales > tr').map(function() { 
                    var tds = $(this).children('td');
                    return { 
                        letterGrade : $($(tds)[0]).text(),
                        lowerLimit  : $($(tds)[1]).text()
                    };
                }))*/
            }, 
            function(data)
            {
                console.log(data);
            })

,它调用以下服务方法:

public static boolean validateUserForm(HttpServletRequest req)
{

    // get all the parameters here
    try {
        Type type = new TypeToken<ReimbursementRequest>() {}.getType();
        ReimbursementRequest rr = gson.fromJson(req.getReader(), type);
        System.out.println(rr.toString());


    } catch (JsonSyntaxException e) {
        e.printStackTrace();
        return false;
    } catch (JsonIOException e) {
        e.printStackTrace();
        return false;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
    catch (NumberFormatException ex)
    {
        ex.printStackTrace();
        return false;
    }
    return true;
}

我的ReimbursementRequest POJO看起来像这样:

package p1.revature.beans;

public class ReimbursementRequest extends Bean {
private int id, requesterID;
private double amount;
private String status;
private int reimbursableEventID;
private ReimbursableEvent reimbursableEvent;


/**
 * Default constructor
 */
public ReimbursementRequest() {
    super();
}
/**
 * Constructor for everything but the id. This is used to insert into the reimbursement request table
 * @param requesterID : the ID of the Employee requesting reimbursement
 * @param amount : the amount requested
 * @param status : the status of the request
 * @param reimbursableEventID : the id of the ReimbursableEvent the requester is trying to have covered
 */
public ReimbursementRequest(int requesterID, double amount, String status, int reimbursableEventID) {
    super();
    this.requesterID = requesterID;
    this.amount = amount;
    this.status = status;
    this.reimbursableEventID = reimbursableEventID;
}

/**
 * Constructor for every field but the reimbursable event id. Used for rendering material client-side
 * @param id
 * @param requesterID
 * @param amount
 * @param status
 * @param reimbursableEvent
 */
public ReimbursementRequest(int id, int requesterID, double amount, String status,
        ReimbursableEvent reimbursableEvent) {
    super();
    this.id = id;
    this.requesterID = requesterID;
    this.amount = amount;
    this.status = status;
    this.reimbursableEvent = reimbursableEvent;
}
/**
 * Constructor for every field. Used for select queries.
 * @param id : the primary key of this request
 * @param requesterID : the ID of the Employee requesting reimbursement
 * @param amount : the amount requested
 * @param status : the status of the request
 * @param reimbursableEventID : the id of the ReimbursableEvent the requester is trying to have covered
 */
public ReimbursementRequest(int id, int requesterID, double amount, String status, int reimbursableEventID) {
    super();
    this.id = id;
    this.requesterID = requesterID;
    this.amount = amount;
    this.status = status;
    this.reimbursableEventID = reimbursableEventID;
}
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public int getRequesterID() {
    return requesterID;
}
public void setRequesterID(int requesterID) {
    this.requesterID = requesterID;
}
public double getAmount() {
    return amount;
}
public void setAmount(double amount) {
    this.amount = amount;
}
public String getStatus() {
    return status;
}
public void setStatus(String status) {
    this.status = status;
}
public int getReimbursableEventID() {
    return reimbursableEventID;
}
public void setReimbursableEventID(int reimbursableEventID) {
    this.reimbursableEventID = reimbursableEventID;
}
public ReimbursableEvent getReimbursableEvent() {
    return reimbursableEvent;
}
public void setReimbursableEvent(ReimbursableEvent reimbursableEvent) {
    this.reimbursableEvent = reimbursableEvent;
}
@Override
public String toString() {
    return "ReimbursementRequest [id=" + id + ", requesterID=" + requesterID + ", amount=" + amount + ", status="
            + status + ", reimbursableEventID=" + reimbursableEventID + ", reimbursableEvent=" + reimbursableEvent
            + "]";
}


}

出于某种原因,Gson认为我正在传递一个普通的ol字符串,当我实际传递一个JSON字符串时。它返回此错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
    at com.google.gson.Gson.fromJson(Gson.java:888)
    at com.google.gson.Gson.fromJson(Gson.java:853)
    at p1.revature.services.HandleDashboardData.validateUserForm(HandleDashboardData.java:34)
    at p1.revature.servlets.SubmitDashboardInfo.doPost(SubmitDashboardInfo.java:32)

我正拼命地试图让这个项目在2天内完成。我知道这很多,但请帮忙...

2 个答案:

答案 0 :(得分:0)

您可以将数据作为json对象传递... Stringify.json

我会尝试为你找一个例子。

干杯 维基

答案 1 :(得分:0)

在与朋友讨论之后,我发现我应该用JSON.stringify(myBusinessObj);序列化JavaScript对象以将它们发送到服务器。

他问我的问题为什么,让我难以理解......

相关问题