【问题标题】:JSON string parsing in JavascriptJavascript 中的 JSON 字符串解析
【发布时间】:2011-12-24 02:28:49
【问题描述】:

我有一些从 servlet 传递并存储在 xmlhttp.responseText 中的 JSON。我想分解这个 JSON,以便我可以拥有数据、大小、样式、名称等的值。我还希望将小部件值放在单独的变量中。

这是 JSON:

{
  "widget vlaue=2": {
    "debug": "on",
    "window": {
      "title": "Sample Konfabulator Widget",
      "name": "main_window",
      "width": 500,
      "height": 500
    },
  },
  "image": { 
    "src": "Images/Sun.png",
    "name": "sun1",
    "hOffset": 250,
    "vOffset": 250,
    "alignment": "center"
  },
  "text": {
    "data": "Click Here",
    "size": 36,
    "style": "bold",
    "name": "text1",
    "hOffset": 250,
    "vOffset": 100,
    "alignment": "center",
    "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
  }
}    

我试过这个:

obj = JSON.parse(xmlhttp.responseText); 

但这失败了。我在网上找不到任何与之相关的东西。谁能帮我解决这个问题?

【问题讨论】:

  • “失败”是什么意思?您是否从浏览器中收到任何错误?
  • 和vlaue=2有关系吗?
  • 这个输出是“未定义的”
  • 大声笑,当有人说“这听起来可能很愚蠢,但是……”时,这通常不是针对他们正在与之交谈的人。它通常意味着“这听起来很明显,但你为什么不检查一下”。对被说的人没有不尊重。
  • @typedef1 伙计,他不是在说你笨,放松点。事实上,我们有时会犯愚蠢的错误或拼写错误,Strelok 只是提醒您这是您可以检查的一件事。这只是一个温和的提醒/提示,我不会被冒犯。

标签: javascript json parsing servlets xmlhttprequest


【解决方案1】:

您提供的 JSON 是无效。第 9 行包含一个不应该存在的额外 ,

这是一个没有 , 的 JSFiddle。

http://jsfiddle.net/ApDsP/

【讨论】:

  • 好眼光,确实我相信这是错误的。现在我了解到我不应该 100% 依赖 JSON 验证器,因为并非所有验证器都会检查尾随逗号。 (我猜这是因为并非所有 JSON 库都禁止它)
  • 我不知道 OP 将什么 JSON 粘贴到 JSlint,但问题中的 JSON 在 JSlint 中也无效。
  • 实际上,我也DID将他的 JSON 复制并粘贴到 JSONLint 中,而且我第一次这样做时,它成功了。现在我刚刚在 5 秒前再次尝试,结果 FAILED(当然,由于第 9 行中的逗号)。我认为 OP 或某人在我第一次尝试在 JSONLint 中验证它之后编辑了他发布的 JSON。
【解决方案2】:

来自json.org

要将 JSON 文本转换为对象,可以使用 eval() 功能。 eval() 调用 JavaScript 编译器。由于 JSON 是一个 JavaScript 的正确子集,编译器将正确解析 文本并生成对象结构。文本必须包含在 括号以避免在 JavaScript 语法中出现歧义。

var myObject = eval('(' + myJSONtext + ')');

不过还是推荐使用 JSON.parse:

eval 函数非常快。但是,它可以编译和执行 任何 JavaScript 程序,因此可能存在安全问题。指某东西的用途 当来源受信任且有能力时,会指示 eval。很多 使用 JSON 解析器更安全。在基于 XMLHttpRequest 的 Web 应用程序中, 仅允许与提供以下内容的同一来源进行通信 页面,所以它是可信的。但它可能没有能力。如果服务器 JSON 编码不严谨,或者不严谨 验证其所有输入,然后它可以提供无效的 JSON 文本 那可能带有危险的脚本。 eval 函数将 执行脚本,释放其恶意。

为了防止这种情况,应该使用 JSON 解析器。 JSON解析器 将仅识别 JSON 文本,拒绝所有脚本。在浏览器中 提供原生 JSON 支持,JSON 解析器也比 评估。预计原生 JSON 支持将包含在 下一个 ECMAScript 标准。

var myObject = JSON.parse(myJSONtext, reviver);

您的 JSON 可能有问题,请访问 jsonlint.com 获取免费的基于 Web 的 JSON 验证器。

【讨论】:

  • 我的 JSON 已通过 JSONLint 验证。在我使用 Javascript 之前,我一直在这样做。
  • 您说它来自一个 servlet,您是否 100% 确定该字符串没有被自动转义或修改?我曾经使用 PHP 传递一个 JSON 字符串,你可能知道,双引号把一切都搞砸了,因为它没有在 PHP 中正确转义。由于每种语言都有不同的转义字符,因此 servlet 的预期输出可能已更改。尝试在服务器端打印出 JSON 字符串,看看它是否与您在上面发布的完全一样。
  • 那么上面的例子就是一个类似的例子。由于机密性,我无法发布确切的 JSON。虽然我的 JSON 已经通过 JSONLint 进行了验证。
  • 在您的第一篇文章中,JSON 是从 servlet 的 OUTPUT 还是从您编写的某些源代码复制并粘贴的?我真的怀疑JSON在执行过程中被不知不觉地修改了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多