【问题标题】:Is it possible to get YQL to return multiple JSON results from a site in a single request?是否可以让 YQL 在单个请求中从站点返回多个 JSON 结果?
【发布时间】:2011-12-20 16:55:09
【问题描述】:

我目前正在使用此 YQL(雅虎查询语言)查询将 JSON 从网站转换为 JSONP:

select * from json where url="http://airportcode.riobard.com/airport/ABC?fmt=JSON"

ABC是参数。

所以我知道 YQL 的设计类似于 SQL,并且我认为有一些功能可以让您进行联接,但我不确定是否可以使用这些功能将对该机场代码站点的多个查询组合成一个请求。 (该网站不支持此功能,并且该网站的所有者尚未回复我的电子邮件查询。)

基本上,我想要一个 YQL 查询,它不仅可以在一次调用中获得ABC 的结果,还可以获得ABCXYZFOO 的结果。有可能吗?

【问题讨论】:

    标签: json join yql


    【解决方案1】:

    您还可以充分利用 uritemplate 表将机场代码转换为一组 URL,然后将这些 URL 提供给 json 表。

    机场代码到网址

    uritemplate 表采用“模板”和任意数量的值来填充该模板。 (另请参阅URI Template 草稿)。

    在这种情况下,需求很简单,只需将机场代码注入到适当位置的路径中即可。

    select * from uritemplate where
    template="http://airportcode.riobard.com/airport/{airport}?fmt=JSON"
    and airport in ("SFO", "LAX", "LHR")
    

    (Try this query in the YQL console)

    这给出了以下结果(为简单起见,删除了diagnostics 信息)。

    从这些 URL 获取 JSON 结果

    现在我们有了一个 URL 列表,使用 json 表通过 sub-select 检索每个 URL 的 JSON 非常简单。事实上,我们已经在上面使用了一个子选择,可以通过 in (…) 语法识别。

    select * from json where url in (
        select url from uritemplate 
        where template="http://airportcode.riobard.com/airport/{airport}?fmt=JSON" 
        and airport in ("SFO", "LAX", "LHR")
    )
    

    (Try this query in the YQL console)

    这次的结果是这样的。

    轻松查询

    我非常喜欢 YQL 的 query aliases(以及相关的变量替换,例如 @var),它可以提供简洁的端点供您访问,而无需将 YQL 查询嵌入到网址。上面的链接详细说明了如何创建它们,最终结果是您可以拥有如下所示的 YQL 查询。

    select * from json where url in (
        select url from uritemplate where 
        template="http://airportcode.riobard.com/airport/{airport}?fmt=JSON" 
        and airport in (@ap)
    )
    

    使用查询别名(我称之为 airports),可以通过如下 URL 访问查询,并且能够轻松更改或添加更多/更少的机场代码。

    http://query.yahooapis.com/v1/public/yql/peter/airports?ap=SFO&ap=LHR&ap=BOB
    

    (Go there。注意:我可能会删除此别名,恕不另行通知。)

    阅读:

    【讨论】:

    • 不,这不正常,看起来你做错了™。如果您还没有解决它,请向我们展示您为获得该结果结构所做的工作。
    【解决方案2】:

    是的!

    而且它不使用像joinquery.multiexecute 这样复杂的东西。在寻找这些选项之后,我终于发现它比只需要or 和重复使用url= 简单得多,每个参数一个:

    select * from json where url="http://airportcode.riobard.com/airport/LAX?fmt=JSON"
      or url="http://airportcode.riobard.com/airport/SFO?fmt=JSON"
      or url="http://airportcode.riobard.com/airport/LHR?fmt=JSON"
    

    我想知道是否有一种更简洁的方法可以避免重复的相似网址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多