C# 向webservice发送带撇号的json值时出现无效的对象错误

C# 向webservice发送带撇号的json值时出现无效的对象错误,c#,jquery,json,C#,Jquery,Json,我正试图将一个json对象发送到一个webservice,以便反序列化为一个自定义(LineItemWithDetails)对象。当json中的任何位置有apstrophes被传递到Web服务时,我会得到下面的错误。在这种情况下,它是“预算合理性”。我不知道我应该在这里做什么 $.ajax({ type: "POST", url: baseUrl + "/WebService/BudgetGrid.asmx/SaveLineItemDetails", data: "{de

我正试图将一个json对象发送到一个webservice,以便反序列化为一个自定义(LineItemWithDetails)对象。当json中的任何位置有apstrophes被传递到Web服务时,我会得到下面的错误。在这种情况下,它是“预算合理性”。我不知道我应该在这里做什么

$.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 "";
    }
$.ajax({
类型:“POST”,
url:baseUrl+“/WebService/BudgetGrid.asmx/SaveLineItemDetails”,
数据:“{details:'”+JSON.stringify(_-lineItemObj)+”,categoryId:“+_-lineItemObj.LineItem.categoryId+”,lineItemId:“+_-lineItemObj.LineItem.ID+”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:
功能(响应){
},
错误:
功能(响应){
淋浴ROR(response.responseText);
}
});
[WebMethod(true)]
公共字符串SaveLineItemDetails(字符串详细信息、int-categoryId、int-lineItemId)
{
PersistantData会话=PersistantData.getInstance();
BudgetBase BudgetBase=BudgetFactory.Retrieve((BudgetTypes)categoryId,session.GranteId,session.GrantID,session.BudgetYear,session.BatchVersion,session.SourceID,session.ApplicationID,session.OriginID,session.BudgetChangeRequestFundingType,session.BatchID,session.UserID);
JavaScriptSerializer serializer=新的JavaScriptSerializer();
Gov.Grants.Budget.Business.LineItem.LineItemWithDetails d=序列化程序。反序列化(详细信息);
budgetBase.SaveDetails(d,lineItemId);
返回“”;
}
错误消息
“{”消息“:“传入的对象无效,\u0027:\u0027或\u0027}\u0027应为。(428)以下:::{详情::{详情::{详情::{详情::{详情::{详情::{详情::{详情:{详情:::{详情::{2007年::{2007年:{2007年:{2007年:{2007年7月27:{2007年7月27:{2007年::“,,,,,,,,,“应用ID::0【州外】\、【例外文本】:\“其他:州外旅行费用($1970)仅限于NIC、乙肝协调员会议、项目经理/PHA会议、ACIP会议、VFC和AFIX培训以及其他CDC赞助的免疫计划会议。\”、【DiffGram\:“FA旅行项目需要更多信息。\”、【用户ID】:452、\“AllocID\”:57695,“AllocGuid\”:“00000000-0000-0000-0000-000000000000\”,“IsReviewedLI\”:true,“'NMIStatusID\”:1,“'NMIStatus\”:“未寻址”,“详细信息”:{“地点”:“PHIN会议”,“NumTrips\”:1,““NumPeople\”:“5\”,“NumDays\”:5,““AmtPerDi”
“AmtAir”:850,“AmtOther\:240,,“Numm们们:”:56:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,“:\“TravelType\”,\“Lookup\u ID\”:2,\”BudgetYear\“:-1、\“LookupValue\”:\“超出状态\”、\“LookupKey\”:\“\”、\“LookupCode\”:\“\”、\“LookupText\”:\“}]、\“DefaultNumOfMonth\”:12、\“BudgetJustification\”:\”这是年度公共卫生信息网络会议。WVSIIS经理或指定人员将出席会议,以了解PHIN、CRA和其他公共卫生应用程序和方向的最新进展。\”、\“标识符\:\“PHIN\”、\“CategoryConfig\”:null}}}\u0027,categoryId:3,lineItemId:18494}、“StackTrace”:“位于System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32深度)\r\n位于System.Web.Script.Serialization.JavaScriptObjectDeserializer.Deserialia

lizeInternal(Int32深度)\r\n位于System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串输入,Int32 depthLimit,JavaScriptSerializer序列化程序)\r\n位于System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer序列化程序,字符串输入,类型,Int32 depthLimit)\r\n位于System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](字符串输入)\r\n位于System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext上下文,JavaScriptSerializer序列化程序)\r\n位于System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData,HttpContext上下文)\r\n在System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext上下文,WebServiceMethodData methodData)”,“ExceptionType:“System.ArgumentException”}“

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

因此,我的属性名(即details、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>

$(文档).ready(函数(){
var值={Name:'David',
年龄:199岁,
彩色:“蓝色”,
FavFood:“比萨饼”,
嘘:{Foo:'hoo',
酒吧:“雷”
}
};
var valJson=JSON.stringify(值);
var-dataJson={details:valJson,categoryId:1,lineItemId:2};
var dataJsonString=JSON.stringify(dataJson);
警报(dataJsonString);
$.ajax({
类型:“POST”,
url:“BudgetGrid.asmx/SaveLineItemDetails”,
contentType:“应用程序/json;字符集=utf-8”,
数据:dataJsonString,
数据类型:“json”,
成功:函数(响应){alert('yay');},
错误:functi
<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>
[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 "";
    }
}