我正在研究JSON API,我想做类似Facebook的opengraph样式。 opengraph风格缩进和折断线,你怎么做呢?如果您通过HTML或CSS使用样式,则无法加载JSON。
答案 0 :(得分:3)
您可以使用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内容类型,并使用新的行和标签来打印它,而不是HTML。
答案 1 :(得分:3)
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"}
但是对于谷歌浏览器,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的评论)从请求标题中检测到。