无效的JSON格式

时间:2012-11-23 13:46:01

标签: jquery asp.net ajax

我正在构建JSON对象并使用JQuery ajax将其传递给服务器。

data: "{'authorID' : '" + authorID +
      "', 'title' : '" + encodeURIComponent(blogTitle) +
      "', 'msg' : '" + encodeURIComponent(blogBody) +
      "', 'preview' : '" + encodeURIComponent(mediaContent) +
      "', 'layoutID' : '" + previewLayoutId +
      "', 'threadID' : '" + threadID + "'}"

但是当我的blogBody变量包含'时,代码失败并显示错误消息:

{"Message":"Invalid object passed in, \u0027:\u0027 or \u0027}\u0027 expected. (107): {\u0027authorID\u0027 : \u0027148385\u0027, \u0027title\u0027 : \u0027123213\u0027, \u0027msg\u0027 : \u0027%3Cp%3Eqqq%3C%2Fp%3E%3Cp%3E%3Cbr%3E%3C%2Fp%3E%3Cp%3E\u0027\u0027\u0027\u0027%3C%2Fp%3E\u0027, \u0027preview\u0027 : \u0027\u0027, \u0027layoutID\u0027 : \u00271\u0027, \u0027threadID\u0027 : \u00270\u0027}","StackTrace":"   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(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"}

有人可以说错误在哪里以及如何解决?

5 个答案:

答案 0 :(得分:7)

JSON中,必须使用双引号(")引用键,而不是单引号(')。同样,字符串值必须是双引号,而不是单引号。你正在使用单引号。例如,大约authorId和标题文本周围。

所以至少,你需要交换那些引号,例如:

data: '{"authorID" : "' + authorID +
      '", "title" : "' + encodeURIComponent(blogTitle) +
      '", "msg" : "' + encodeURIComponent(blogBody) +
      '", "preview" : "' + encodeURIComponent(mediaContent) +
      '", "layoutID" : "' + previewLayoutId +
      '", "threadID" : "' + threadID + '"}'

答案 1 :(得分:1)

请改用:

JSON.stringify(object)

答案 2 :(得分:0)

使用Microsoft的JavaScriptSerializer()函数将对象转换为JSON时,我遇到了同样的问题。

它会将撇号转换为\u0027,但 jqGrid 会很乐意继续将它们显示为\u0027

enter image description here

我的解决方案只是停止使用Microsoft的JavaScriptSerializer()函数..

string JSON = new JavaScriptSerializer().Serialize(myListOfObjects).ToString();

..并切换到JSON.Net ..

string JSON = JsonConvert.SerializeObject(myListOfObjects);

JSON.Net还避免了将DateTimes转换为JSON的问题。微软的版本使用它自己讨厌的日期格式,例如:

/Date(1355496152000)/

呃,是的。是时候再去谷歌了。或者使用JSON.Net!

答案 3 :(得分:-1)

JSON字段名称应该是双引号,字符串值也应该是双引号。请参阅JSON语法规则here。 您还可以使用DebugJSON等在线JSON验证网站验证JSON输出。

答案 4 :(得分:-2)

作为T.J. Crowder说,你的元素应该有双引号,为了确保你的格式正确,你可以在这里验证你的json数组(我总是这样做):

另外,最好使用this生成json数组

http://jsonlint.com/