2012-11-23 90 views
2

我正在構建JSON對象並使用JQuery ajax將其傳遞給服務器。JSON格式無效

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"} 

有人能說得清是錯誤和如何解決它?

+0

你有沒有試過http://jslint.com或http://jshint.com?這些都適合查看你的JSON輸出來處理問題。 –

+0

爲什麼要手工構建JSON而不是僅僅使用數據結構並對其進行序列化呢?根據http:// jsonlint提供的 – PhonicUK

+0

。com /你的json是完美的錯誤可能是由於你的服務器端代碼 –

回答

7

JSON中,密鑰必須用雙引號(")引用,而不是單引號(')。同樣,字符串值必須是雙引號,而不是單引號。你正在使用單引號。例如,圍繞authorId和標題的文字。

那麼至少,你需要周圍交換這些報價,例如:

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

而出現的另外,當你已經[完美的函數]時,你不應該自己編寫JSON(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/JSON/stringify)只是躺在。 –

+0

是的,你是對的。謝謝。 – Vytalyi

-2

由於T.J.克羅德說,你的元素應該有雙引號,並確保您的格式是正確的,你可以隨時在這裏驗證您的JSON數組(我總是這樣):

而且您更好地使用this生成JSON數組

http://jsonlint.com/

1

使用這個代替:

JSON.stringify(object) 
-1

使用微軟的JavaScriptSerializer()功能開啓對象爲JSON時,我有同樣的問題。

這將撇號轉換爲\u0027,但的jqGrid會愉快地繼續將其顯示爲\u0027

enter image description here

我的解決辦法是簡單地停止使用微軟的JavaScriptSerializer()功能..

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

..並切換到JSON.Net ..

string JSON = JsonConvert.SerializeObject(myListOfObjects); 

JSON.Net還避免了將DateTimes轉換爲JSON的問題。微軟的版本使用它自己討厭的日期格式,例如:

/Date(1355496152000)/ 

錯誤,是的。有時間再次谷歌搜索。或者使用JSON.Net!

-1

JSON字段名稱應該用雙引號括起來,字符串值也應該用雙引號。請參閱JSON語法規則here。 您也可以使用在線JSON驗證網站(如DebugJSON)驗證JSON輸出。