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

Posted

技术标签:

【中文标题】将带撇号的 json 值发送到 Web 服务时出现无效对象错误【英文标题】:Invalid object error when sending json values with apostrophe to webservice 【发布时间】:2011-11-15 15:19:05 【问题描述】:

我正在尝试将 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""

【问题讨论】:

我删除了我的答案。我明白您要完成的工作,而 David Hoerster 的回答更符合要求。 【参考方案1】:

问题在于您的 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 "";
    

【讨论】:

非常感谢,这成功了。我很确定它是相关的,因为当我删除它们时它很好。 谢谢你,在我找到你的答案之前一直被这个问题困扰。 谢谢大卫。我也很喜欢其他人如此着迷于在其中一个领域,尝试了所有方法来逃避它....终于降落在这里..谢天谢地:-)。非常感谢。 就算是数字也要用引号括起来?

以上是关于将带撇号的 json 值发送到 Web 服务时出现无效对象错误的主要内容,如果未能解决你的问题,请参考以下文章

通过 PhpMyAdmin 将带撇号的 SQL 数据库导入 MySQL

带撇号的 Python 标题()

带撇号的字母消失了[重复]

如何在Elasticsearch上搜索带或不带撇号的单词?并处理拼写错误?

当 json 数据的值发布到 .net Web 服务时出现 Json Failed 错误?

将 Postman 请求发送到 json 服务器时出现问题