将带有撇号的json值发送到webservice时出现无效的对象错误

我试图将一个json对象发送到Web服务,以反序列化为自定义(LineItemWithDetails)对象。 当json中的任何地方都有apstrophes传递给webservice时,我得到以下错误。 在这种情况下,它是“BudgetJustification”。 我不知道我应该在这做什么。

$.ajax({ type: "POST", url: baseUrl + "/WebService/BudgetGrid.asmx/SaveLineItemDetails", data: "{details: '" + JSON.stringify(_lineItemObj) + "', categoryId: " + _lineItemObj.LineItem.CategoryID + ", lineItemId: " + _lineItemObj.LineItem.ID + " }", contentType: "application/json; charset=utf-8", dataType: "json", success: function (response) { }, error: function (response) { ShowError(response.responseText); } }); [WebMethod(true)] public string SaveLineItemDetails(string details, int categoryId, int lineItemId) { PersistantData session = PersistantData.getInstance(); BudgetBase budgetBase = BudgetFactory.Retrieve((BudgetTypes)categoryId, session.GranteeID, session.GrantID, session.BudgetYear, session.BatchVersion, session.SourceID, session.ApplicationID, session.OriginID, session.BudgetChangeRequestFundingType, session.BatchID, session.UserID); JavaScriptSerializer serializer = new JavaScriptSerializer(); Gov.Grants.Budget.Business.LineItem.LineItemWithDetails d = serializer.Deserialize(details); budgetBase.SaveDetails(d, lineItemId); return ""; } 

错误信息

"{"Message":"Invalid object passed in, \u0027:\u0027 or \u0027}\u0027 expected. (428): {details: \u0027{\"LineItem\":{\"ID\":18494,\"ParentID\":18487,\"ApplicationID\":0,\"GranteeID\":57,\"BudgetYear\":2011,\"LineItemTypeID\":3,\"CategoryID\":3,\"CategoryName\":\"Travel\",\"VersionID\":0,\"OriginID\":2,\"AmtChange\":0,\"LineItemGuid\":\"fab8d064-767b-4526-8762-81a849361551\",\"Description\":\"PHIN conference - 1 + Trip(s) + [Out of State]\",\"ExceptionText\":\"Other: Out of state travel costs ($1,970) are restricted to NIC, Hepatitis B Coordinators\u0027 Meeting, Program Managers/PHA Meeting, ACIP meetings, VFC and AFIX training, and other CDC-sponsored immunization program meetings. \",\"DiffGram\":\"FA Travel Line Item Needs More Information.\",\"UserID\":452,\"AllocID\":57695,\"AllocGuid\":\"00000000-0000-0000-0000-000000000000\",\"IsReviewedLI\":true,\"NMIStatusID\":1,\"NMIStatus\":\"Not Addressed\"},\"Details\":{\"Location\":\"PHIN conference\",\"NumTrips\":1,\"NumPeople\":\"5\",\"NumDays\":5,\"AmtPerDi em\":56,\"NumNights\":4,\"AmtLodging\":150,\"AmtAir\":850,\"AmtOther\":240,\"NumMiles\":0,\"AmtMileage\":0.405,\"TravelTypeID\":2,\"TravelTypes\":[{\"LookupName\":\"TravelType\",\"Lookup_ID\":1,\"BudgetYear\":-1,\"LookupValue\":\"In State\",\"LookupKey\":\"\",\"LookupCode\":\"\",\"LookupText\":\"\"},{\"LookupName\":\"TravelType\",\"Lookup_ID\":2,\"BudgetYear\":-1,\"LookupValue\":\"Out of State\",\"LookupKey\":\"\",\"LookupCode\":\"\",\"LookupText\":\"\"}],\"DefaultNumOfMonth\":12,\"BudgetJustification\":\"This is the annual Public Health Information Network Conference. This is attended by the WVSIIS manager or designee to keep abreast with what\u0027s going on with PHIN, CRA and other public health applications and directions.\",\"Identifier\":\"PHIN\",\"CategoryConfig\":null}}\u0027, categoryId: 3, lineItemId: 18494 }","StackTrace":" at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)\r\n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.Deseria lizeInternal(Int32 depth)\r\n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}"

问题在于如何构建JSON。 我根据你的代码创建了一个更简单的例子,这适用于我的测试应用程序(我正在使用VS2010 / C#)。 在JSON中,您应该将属性名称和值都包含在引号中。 这是我的示例应用程序的输出(基于您的代码松散):

 { "details":"{\"Name\":\"David\",\"Age\":\"199\",\"FavColor\":\"Blue\",\"FavFood\":\"Pizza\", \"boo\":{\"Foo\":\"hoo\",\"Bar\":\"ray\"}}", "categoryId":1, "lineItemId":2 } 

所以我的属性名称(即details,categoryId,lineItemId)也包含在引号中。 你的似乎不是 – 因此可能无法通过JSONvalidation。

您可能最好使用JSON2.js文件将对象字符串化为JSON表示法。 它是由Crockford(编写JSON规范)编写的,所以它非常可靠。

这是JSON的JavaScript代码 – 如果你的对象和调用:

    

BudgetGrid.asmx Web服务就像这样简化了(我有一个像代码一样的嵌套对象)….

 [Serializable] class Stuff { public string Foo { get; set; } public string Bar { get; set; } } [Serializable] class Test1 { public string Name { get; set; } public string Age { get; set; } public string FavColor { get; set; } public string FavFood { get; set; } public Stuff boo { get; set; } } [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] [System.Web.Script.Services.ScriptService] public class BudgetGrid : System.Web.Services.WebService { [WebMethod(true)] public string SaveLineItemDetails(string details, int categoryId, int lineItemId) { JavaScriptSerializer serializer = new JavaScriptSerializer(); Test1 boo1 = serializer.Deserialize(details); return ""; } }