如何用PHP从PubMed生成的JSON文件中提取指定字段?
解决PubMed ESummary API JSON提取字段无输出问题
你的代码没输出主要是几个细节问题导致的,我帮你逐一排查并修正:
核心问题分析
- 数组/对象访问方式不匹配:你用
json_decode($json, TRUE)把JSON转成了关联数组,但后续却用对象的->运算符去访问属性,这在PHP里是不兼容的,若报错级别未开启就会直接无输出。 - URL格式错误:拼接的API URL里用了
&(HTML实体转义的&),这会导致请求的URL无效,NCBI服务器可能返回错误JSON或空数据。 - 缺少错误处理:没有判断请求是否成功、JSON解析是否正常、目标PMID是否存在于返回结果中,一旦中间环节出问题就直接无输出。
修正后的完整代码
<?php $new_pmid = $_POST['new_pmid']; // 修正URL:把&换成普通的&,HTML实体在PHP URL拼接里不需要 $api_json_url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=" . $new_pmid . "&retmode=json"; // 加上请求失败的判断 $json = file_get_contents($api_json_url); if (!$json) { echo "请求PubMed API失败,请检查网络或PMID是否有效"; exit; } // 解析JSON,同时检查解析是否成功 $data = json_decode($json, TRUE); if (json_last_error() !== JSON_ERROR_NONE) { echo "JSON解析失败:" . json_last_error_msg(); exit; } // 检查目标PMID是否存在于返回结果中 if (!isset($data['result'][$new_pmid])) { echo "未找到该PMID对应的文献数据,请确认PMID是否正确"; exit; } // 用数组索引方式访问字段 $title = $data['result'][$new_pmid]['title']; $source = $data['result'][$new_pmid]['source']; $issn = $data['result'][$new_pmid]['issn']; $authors = $data['result'][$new_pmid]['authors']; // 这是一个作者数组,可以循环遍历 // 输出测试 echo "标题:" . $title . "<br>"; echo "期刊来源:" . $source . "<br>"; echo "ISSN:" . $issn . "<br>"; echo "作者列表:<br>"; foreach ($authors as $author) { echo "- " . $author['name'] . "<br>"; } ?>
关键细节说明
- 访问字段时用
$data['result'][$new_pmid]['字段名']的数组方式,完全匹配PubMed ESummary返回的JSON结构。 - 增加了多层错误判断,能帮你快速定位问题(比如网络问题、PMID无效、JSON解析失败)。
- 如果需要提取其他字段,可以参考PubMed ESummary的JSON结构,直接用对应的数组键名即可。
内容的提问来源于stack exchange,提问作者Nguyen Hoang Bach
相关产品推荐
相关产品推荐

