我如何解析来自 openlibrary api 的 Json 数据? (适当地)

Posted

技术标签:

【中文标题】我如何解析来自 openlibrary api 的 Json 数据? (适当地)【英文标题】:How do i parse Json data from openlibrary api? (properly) 【发布时间】:2015-09-29 20:33:58 【问题描述】:

如果这个问题已经得到解答,请原谅我。我已经看到了关于 json 数据和 openlibrary 的各种答案

到目前为止,我从 openlibrary 获得的 json 数据和我在示例中看到的 json 数据似乎在格式上有所不同

我的问题是,如何使用 php(或 javascript)将数据放入数组或单个变量中并将它们放入 mysql 数据库中。

对上一个问题的补充 - 我想将下面的原始数据显示为:

标题:书的瓷砖 作者:本书作者 Isbn:Isbn编号 等等

然后将这些细节放入mysql数据库中

[更新 2015-011-07] 现在我已经收到了答案,我已经更新了下面的代码以显示它应该是怎样的。 以下将从 openlibrary 请求 json 数据,并将作为字符串返回。 $url 中的 ISBN 号仅用于测试目的,因此请务必更改它。

<?php
$url ="https://openlibrary.org/api/books?bibkeys=ISBN:0789721813&jscmd=details&format=json";

$headers = array(
    "Content-type: application/json;charset=\"utf-8\"",
    "Accept: text/xml",
    "Cache-Control: no-cache",
    "Pragma: no-cache",
    "SOAPAction: \"run\""
); 

$cURL = curl_init();

curl_setopt($cURL, CURLOPT_URL, $url);
curl_setopt($cURL, CURLOPT_HTTPGET, true);
curl_setopt($cURL, CURLOPT_HTTPHEADER, $headers);
curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($cURL);

foreach (json_decode($result, true) as $book) 
 
   printf("\nISBN: %s\ttitle: %s\tauthor: %s", $book['details']['isbn_10'][0], $book['details']['title'], $book['details']['contributions'][0]);
 

curl_close($cURL);
?>

页面加载后显示如下:

ISBN: 0789721813 title: Red Hat Linux author: Hellums, Duane

【问题讨论】:

你试过json_decode($result, true) 吗?究竟是什么没有按预期工作? 您复制的响应有多行;所以这可能是解析不起作用的原因 我想要的是从原始数据中获取 isbn、作者发布者等,并将适当的值保存到数据库或屏幕 Profligate.fcx,我想这是我做的,我会编辑它并确保它按原样显示 Jeff 我试过 Jain_decide 和输出是一样的,我想改变它在页面上的显示方式并最终保存在 mysql 中 【参考方案1】:

默认情况下cURL会自动输出转账。您的代码仅显示 json 内容,但如果出现问题,curl_exec($cURL) 返回 1 或 0,而不是 json 内容。这就是为什么您无法使用json_decode 获取所需的数组或对象的原因,JSON 字符串不在$result 变量中。

要获得你想要的,你需要设置另一个 cURL 选项:

curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);

这样curl_exec($cURL)会以字符串的形式返回转账,不会再自动输出。

查看PHP manualcurl_exec的返回值。

那么你只需要使用json_decode:

foreach (json_decode($result, true) as $book) 
    printf("\nISBN: %s\ttitle: %s\tauthor: %s", $book['details']['isbn_10'][0], $book['details']['title'], $book['details']['contributions'][0]);

【讨论】:

这非常有效,非常感谢您,我已经阅读了您在 php.net 上链接到的页面,但是我需要很长时间才能进入这个 for 循环。谢谢 Casimir et Hippolyte 我有一个有趣的给你 Casimir et Hippolyte 我把这个通过:openlibrary.org/api/… 并且没有:“contributions”:[“Authors name”],而是:“authors”:[ "name": "Chieko Kan\u014d", "key": "/authors/OL6522097A"] 我试过了:$book['details']['authors'][0] $book['details'][ 'authors'] $book['authors']['name'][0] 遗憾的是 Chieko Kan 没有出现,我有什么想法可以解决这个特定领域吗? @benjayhutton:首先,您必须使用此 url 格式:openlibrary.org/api/…。在前面的示例中,没有authors 项,这就是我使用contributions 的第一项的原因。现在如果你仔细看这个数组,你会看到“第一”作者名字有这个路径(使用print_r查看):$book['details']['authors'][0]['name'] 我想我现在开始理解语法了谢谢你我会试试的【参考方案2】:

这可能会有所帮助

echo 'title : '.$book['details']['title'].'<br />';
echo 'subtitle : '.$book['details']['subtitle'].'<br />';
echo 'lc_classifications : '.$book['details']['lc_classifications'][0].'<br />';
echo 'latest_revision : '.$book['details']['latest_revision'].'<br />';
echo 'edition_name : '.$book['details']['edition_name'].'<br />';
echo 'languages : '.$book['details']['languages'][0]['key'].'<br />';
echo 'subjects : '.$book['details']['subjects'][0].'<br />';
echo 'location : '.$book['details']['location'][0].'<br />';
echo 'type : '.$book['details']['type']['key'].'<br />';
echo 'publish_country : '.$book['details']['publish_country'].'<br />';
echo 'other_titles : '.$book['details']['other_titles'][0].'<br />';
echo 'publishers : '.$book['details']['publishers'][0].'<br />';
echo 'last_modified : '.$book['details']['last_modified']['value'].'<br />';
echo 'key : '.$book['details']['key'].'<br />';
echo 'authors : '.$book['details']['authors'][0]['name'].'<br />';
echo 'publish_places : '.$book['details']['publish_places'][0].'<br />';
echo 'pagination : '.$book['details']['pagination'].'<br />';
echo 'works : '.$book['details']['works'][0]['key'].'<br />';
echo 'isbn 10 : '.$book['details']['isbn_10'][0].'<br />';

【讨论】:

对我来说很合适。我的略有不同,但仅就文本在屏幕上的呈现方式而言?

以上是关于我如何解析来自 openlibrary api 的 Json 数据? (适当地)的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何使用 Alamofire 和 SwiftyJSON 解析来自 API 的 JSON 响应?

如何在 Swift 中解析来自 Alamofire API 的 JSON 响应?

如何在一个 GET 请求中解析来自 Coinbase API 的所有股票代码

以(Json 格式)解析来自 Google Place api 响应的数据

如何在 GraphQL 中解析来自多个数据源的字段

如何从Calendly获得现有的webhook(来自json的解析)?