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

2024-03-30

我正在尝试将 json 对象发送到 Web 服务,以将其反序列化为自定义 (LineItemWithDetails) 对象。当传递给 Web 服务的 json 中的任何位置有撇号时,我会收到以下错误。在本例中,它是“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"}"


问题在于 JSON 的构建方式。我根据您的代码创建了一个更简单的示例,这适用于我的测试应用程序(我使用的是 VS2010/C#)。在 JSON 中,您应该将属性名称和值括在引号中。这是我的示例应用程序的输出(大致基于您的代码):

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

所以我的属性名称(即详细信息、categoryId、lineItemId)也用引号引起来。你的似乎不是——所以 JSON 验证可能会失败。

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

下面是我的 JavaScript 代码,用于对您的对象进行 JSON 化并进行调用:

<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 "";
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将带有撇号的 json 值发送到 web 服务时出现无效对象错误 的相关文章

随机推荐