【问题标题】:What is a "python" api?什么是“python”api?
【发布时间】:2014-09-17 07:24:12
【问题描述】:

有一个网站 (http://xisbn.worldcat.org/xisbnadmin/doc/api.htm) 提供多种格式的 API,包括 XML、CSV、JSON 和称为“python”的东西。我假设这与 Python 编程语言有关,但是如何呢?输出如下所示:

{
 'stat':'ok',
 'list':[{
    'url':['http://www.worldcat.org/oclc/177669176?referer=xid'],
    'publisher':'O\'Reilly',
    'form':['BA',
     'DA'],
    'lccn':['2004273129'],
    'lang':'eng',
    'city':'Sebastopol, CA',
    'author':'by Mark Lutz and David Ascher.',
    'ed':'2nd ed.',
    'year':'2003',
    'isbn':['0596002815'],
    'title':'Learning Python',
    'oclcnum':['177669176',
     '222927677',
     '249274099',
     '253402825',
     '301161087',
     '438280230',
     '442197411',
     '464709193',
     '492988633',
     '54619668',
     '55847258',
     '614957020',
     '644729085',
     '760707144',
     '772683553',
     '802989466',
     '850841661',
     '851226517',
     '875412584']}]}

这对我来说看起来像 JSON,但 JSON 输出虽然相似,但却是这样的:

{
 "stat":"ok",
 "list":[{
    "url":["http://www.worldcat.org/oclc/177669176?referer=xid"],
    "publisher":"O'Reilly",
    "form":["BA",
     "DA"],
    "lccn":["2004273129"],
    "lang":"eng",
    "city":"Sebastopol, CA",
    "author":"by Mark Lutz and David Ascher.",
    "ed":"2nd ed.",
    "year":"2003",
    "isbn":["0596002815"],
    "title":"Learning Python",
    "oclcnum":["177669176",
     "222927677",
     "249274099",
     "253402825",
     "301161087",
     "438280230",
     "442197411",
     "464709193",
     "492988633",
     "54619668",
     "55847258",
     "614957020",
     "644729085",
     "760707144",
     "772683553",
     "802989466",
     "850841661",
     "851226517",
     "875412584"]}]}

“python”示例没有解析为有效的 JSON,那么它是什么?如何在 Python 中解码这些信息?

【问题讨论】:

    标签: python json rest


    【解决方案1】:

    这是一个 Python 字面量;它对所有内容都使用 Python 语法。字典、列表和字符串的 Python 语法非常接近等效的 JSON 语法。 Python 字符串是 字节字符串,而不是像 JSON 中那样的 Unicode 值。

    任何null JSON 值都将在 Python 中表示为 None,任何布尔值都将呈现为 TrueFalse 而不是 JSON truefalse

    您可以使用 ast.literal_eval() function 解析它,但这会比解析 JSON 慢。不要试图在此类数据上使用eval();攻击者只需劫持 API DNS 条目即可为您提供任意 Python 对象并破坏您的进程。

    坦率地说,在我看来,提供 Python 语法毫无意义。他们也提供 PHP 和 Ruby 变体;所有不同的是类型周围的分隔符。这充其量只是一种好奇心。据推测,在其他语言中解析 JSON 也会更快(因为解析 Python、Ruby 或 PHP 需要支持更多类型),或者为eval() 风格的攻击开放这些进程。

    【讨论】:

    • 我猜这个“python 代码”的好处是您可以使用 JSON 中未考虑的数据结构,例如 set。实际上,这并不是一个巨大的好处。
    • 那么,如果 JSON 更快,那又有什么意义呢?我应该使用这个还是 JSON?
    • @ikaros45:我怀疑 API 是否会提供任何这样的数据结构。同样的数据也需要用 JSON、CSV、Ruby、PHP 和 HTML 表示。
    • @felixphew:使用 JSON;我非常怀疑他们会使用任何难以用 JSON 表示的原生 Python 数据类型。
    • 他们似乎在鼓励人们eval() 这个东西(以他们选择的语言),而不是使用适当的解析库。谢天谢地ast.literal_eval(),但我敢打赌有些人会使用香草eval()...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2012-12-09
    相关资源
    最近更新 更多