【问题标题】:jQuery .getJSON() Not Parsing All ObjectsjQuery .getJSON() 不解析所有对象
【发布时间】:2011-02-21 11:53:18
【问题描述】:

我正在使用 jQuery 的 .getJSON 函数来解析来自 Google Search Appliance 的一组搜索结果。 Search Appliance 有一个 xslt 样式表,它以 JSON 数据的形式返回结果,我使用 JSONLint 和 Curious Concept 的 JSON 格式化程序对其进行了验证。

根据 FireBug,完整的结果集是从 XMLHTTPRequest 返回的,但我尝试转储数据(使用 jquery.dump.js)并且它只解析回第一个结果。它确实成功获取了所有 Google 搜索协议的内容,但它只看到一个“R”对象(或单个结果)。

有人对 jQuery 的 .getJSON 有过类似的问题吗?我知道如果 JSON 无效,它喜欢默默地失败,但就像我说的,我用几个验证器验证了结果,应该很好。

编辑: 单击此链接将显示搜索“google”一词返回的 JSON 结果:http://bigbird.uww.edu/search?client=json_frontend&proxystylesheet=json_frontend&proxyrefresh=1&output=xml_no_dtd&q=google

jQuery 只检索第一个“R”对象,即使所有“R”对象都是兄弟对象。

【问题讨论】:

  • 如果您能发布一个响应样例,这会很有帮助。
  • 能否为您的问题添加一个示例回复?
  • 好的,我添加了一个链接,可将您带到 Google Search Appliance 的一些 JSON 结果。起初我在想我不知道我是否想在这里公开发布,但后来我意识到这只是搜索结果数据,无论如何你都可以从大学网站上获得。
  • 查看我更新的答案 - 你不能指望它可以像这样使用多个单独的“R”值。它必须是一个数组。

标签: javascript jquery json getjson


【解决方案1】:

您可以尝试使用自己的“jsonpCallback”函数自己执行“getJSON”。如果您调用的 API 的响应看起来像一个逗号分隔的 JSON 表达式 list,那么 jQuery 自动构造的回调函数只会看到第一个。

换句话说,如果 API 返回

{something: "foo", whatever:23}, {something: "bar", whatever, 32}

那么响应脚本块中的最终结果是:

magicJqueryCallback({something: "foo", whatever:23}, {something: "bar", whatever, 32})

jQuery 回调被声明为只有一个参数,它分配给假 XHR 对象的“数据”元素。

或者,如果您可以控制 XSLT 代码的作用,您可以让它在到达 jQuery 之前将响应列表包装在一组方括号中:

[{something: "foo", whatever:23}, {something: "bar", whatever, 32}]

如果您的 XSLT 生成了它,它(我希望)可以与 getJSON 一起正常工作。

编辑好的,我现在看到你的问题了。

您的 JSON 响应在外部对象内包含多个“R”值。这是行不通的:如果“R”是一个列表,它需要有一个单个值,该值是一个数组。

  {"GSP": ..., "R":[{"U": ... }, {"U": ... }, {"U": ...}], ...}

【讨论】:

  • 好吧,我实际上并没有使用 JSONP,因为 Google Search Appliance 不提供执行 JSONP 的能力,所以我只是通过一个简单的小 PHP 代理获取原始 JSON 数据(诱使 jQuery 认为它来自本地服务器)。我将发布一个上面返回数据的示例。
  • 啊,有道理。我想我(愚蠢地)假设 JSON 被 JS Lint / 其他验证器“验证”意味着它很好,我不必去想,哈哈。不能有两个元素具有相同的键是有道理的。
  • 嗯,有趣的是验证器至少没有发出警告,因为它并不难检测到它正在发生。
  • 没错,也许我会通过电子邮件向 JS Lint 人员发送电子邮件,让他们知道正在发生这种情况。
【解决方案2】:

或者,您总是可以只使用 $.ajax 函数,然后简单地评估生成的 JSON。我知道这通常是不明智的,但由于您可以确定 Google Search Appliance 不会注入任何类型的攻击,因此可以在这种情况下使用它。

【讨论】:

  • 如果他只是使用eval() 在这种情况下根本没有帮助。他必须实现一个特殊的 JSON 解析器,这似乎不值得。
  • 是的,对结果数据进行 eval 只会做与 jQuery 已经在做的事情一样的事情——它将每个“R”元素覆盖到下一个结果,只留下一个。我重新设计了 XSLT,以按其基本顺序命名每个“R”元素,而不是仅仅将它们称为“R”,现在它可以正常工作了。 :)
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多