【问题标题】:Invalid JSON format无效的 JSON 格式
【发布时间】:2012-11-23 13:46:01
【问题描述】:

我正在构建 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"}

有人能说出错误在哪里以及如何解决吗?

【问题讨论】:

  • 你试过jslint.comjshint.com吗?这些都有助于查看您的 JSON 输出以处理问题。
  • 为什么要手动构建 JSON 而不是仅仅创建一个包含数据的结构并对其进行序列化?
  • 根据jsonlint.com,您的 json 是完美的错误可能会由于您的服务器端代码而出现

标签: jquery asp.net ajax


【解决方案1】:

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

因此,您至少需要交换这些引号,例如:

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

【讨论】:

【解决方案2】:

改用这个:

JSON.stringify(object)

【讨论】:

    【解决方案3】:

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

    它将撇号转换为\u0027,但jqGrid会很高兴地继续将它们显示为\u0027

    我的解决方案就是停止使用微软的JavaScriptSerializer() 函数..

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

    ..并切换到 JSON.Net..

    string JSON = JsonConvert.SerializeObject(myListOfObjects);
    

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

    /Date(1355496152000)/
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        http://jsonlint.com/

        【讨论】:

          猜你喜欢
          • 2014-10-03
          • 2019-11-12
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 1970-01-01
          • 2018-12-23
          • 1970-01-01
          相关资源
          最近更新 更多