【问题标题】:Styling JSON pages样式化 JSON 页面
【发布时间】:2012-03-22 17:25:00
【问题描述】:

我正在开发 JSON API,我想做一些类似于 Facebook 的 opengraph 样式的事情。 opengraph 风格的缩进和断行,你是怎么做的呢?如果您通过 HTML 或 CSS 使用样式,则无法加载 JSON。

【问题讨论】:

  • 那么你的问题是什么?浏览器对 json 的样式不同,这取决于您使用的是哪一种以及是否安装了 JSON 插件。
  • "opengraph 样式缩进断行,你是怎么做的?"

标签: html css json api


【解决方案1】:

您可以使用JSON_PRETTY_PRINT,这是PHP 5.4 中的新功能:

<?php 

// Facebook sends a Content-Type of text/javascript
// So I assume you want to too, but you may prefer
// application/json
header('Content-Type: text/javascript');

echo json_encode($data, JSON_PRETTY_PRINT);

?>

如果您没有,或者无法升级到 5.4 版,那么您必须找到一些服务器端解析器。

编辑

我不知道为什么我假设你在没有标记 PHP 的情况下使用它。无论您使用哪种服务器端语言,您都希望发送一个非 html 的 Content-Type 并使用新的行和标签来漂亮地打印它,而不是 HTML。

【讨论】:

  • 你猜对了,我不知道为什么我没有自己标记它。
  • @Jake 好吧,酷 :) 你有 5.4 或升级的能力吗?本月刚刚发布稳定版。
  • 我只能在我的网站的本地开发版本上使用。
  • @Jake 在这种情况下检查此帖子以获取用户函数 json 漂亮打印机:php.net/manual/en/function.json-encode.php#80339
  •  到 resque 以在 HTML 中保留空格。
【解决方案2】:

facebook 似乎正在使用浏览器检测来格式化服务器上​​的 JSON。

对于 wget,不应用格式:

> wget -q -S -O - http://graph.facebook.com/4
  HTTP/1.1 200 OK
  Access-Control-Allow-Origin: *
  Cache-Control: private, no-cache, no-store, must-revalidate
  Content-Type: text/javascript; charset=UTF-8
  ETag: "539feb8aee5c3d20a2ebacd02db380b27243b255"
  Expires: Sat, 01 Jan 2000 00:00:00 GMT
  P3P: CP="Facebook does not have a P3P policy. Learn why here: http://fb.me/p3p"
  Pragma: no-cache
  X-FB-Rev: 526949
  Set-Cookie: datr=imJrT4lrhBZ48Mrtw4uYfByk; expires=Sat, 22-Mar-2014 17:34:02 GMT; path=/; domain=.facebook.com; httponly
  X-FB-Debug: +gpBLnliDoRvuNtlHIwHASwsDz4pJm9TP3btrrw6AsE=
  X-Cnection: close
  Date: Thu, 22 Mar 2012 17:34:02 GMT
  Content-Length: 172
{"id":"4","name":"Mark Zuckerberg","first_name":"Mark","last_name":"Zuckerberg","link":"http:\/\/www.facebook.com\/zuck","username":"zuck","gender":"male","locale":"en_US"}

但对于 google chrome,wireshark 显示的文本格式为空格和换行符:

{
   "id": "4",
   "name": "Mark Zuckerberg",
   "first_name": "Mark",
   "last_name": "Zuckerberg",
   "link": "http://www.facebook.com/zuck",
   "username": "zuck",
   "gender": "male",
   "locale": "en_US"
}

(它确实是不同的数据——在这种情况下,Content-Length 是 210)。请注意,Content-Type 仍然是 text/javascript - 它们不会呈现为 HTML。

所以你需要为你使用的任何语言使用 JSON 格式化程序(我猜你已经在使用一个库,所以检查它是否有“prettyprint”选项或类似选项)。另外,如果您想在格式化似乎不重要时节省带宽,可以从请求标头检测浏览器(和一般上下文 - 请参阅 Paul 的评论)。

【讨论】:

  • 看起来他们检测到你的用户代理和漂亮的浏览器打印,但可能不是来自他们的 JS API 或 CURL 请求中的请求。由于浏览器直接发出的大多数请求可能实际上是想要阅读它的开发人员,所以这是有道理的。
  • 是的;上面引用了你:o​​)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多