我正在尝试将json对象发送到webservice,以反序列化为自定义(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<Gov.Grants.Budget.Business.LineItem.LineItemWithDetails>(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"}"
答案 0 :(得分:14)
问题在于如何构建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)也包含在引号中。你的似乎不是 - 因此可能无法通过JSON验证。
您最好使用JSON2.js文件将对象字符串化为JSON表示法。它是由Crockford(编写JSON规范)编写的,所以它非常可靠。
这是我对JSON的JavaScript代码 - 如果您的对象并且进行调用:
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.3.min.js"></script>
<script type="text/javascript" src="http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js"></script>
<script type="text/javascript">
$(document).ready(function () {
var value = { Name: 'David',
Age: '199',
FavColor: 'Blue',
FavFood: 'Pizza',
boo: { Foo: 'hoo',
Bar: 'ray'
}
};
var valJson = JSON.stringify(value);
var dataJson = { details: valJson, categoryId: 1, lineItemId: 2 };
var dataJsonString = JSON.stringify(dataJson);
alert(dataJsonString);
$.ajax({
type: "POST",
url: "BudgetGrid.asmx/SaveLineItemDetails",
contentType: "application/json; charset=utf-8",
data: dataJsonString,
dataType: 'json',
success: function (response) { alert('yay'); },
error: function (response) { alert('boo'); }
});
});
</script>
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<Test1>(details);
return "";
}
}