【问题标题】:How to extract a particular value from this json output如何从此 json 输出中提取特定值
【发布时间】:2018-05-15 21:48:43
【问题描述】:

我正在尝试如下解码 pubmed json 输出。

  1. https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=29753496&retmode=json

  2. https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=15674886&retmode=json

如何从该输出中提取 doi?

        "articleids": [
            {
                "idtype": "pubmed",
                "idtypen": 1,
                "value": "15674886"
            },
            {
                "idtype": "doi",
                "idtypen": 3,
                "value": "10.1002/14651858.CD001801.pub2"
            },
            {
                "idtype": "rid",
                "idtypen": 8,
                "value": "15674886"
            },
            {
                "idtype": "eid",
                "idtypen": 8,
                "value": "15674886"
            }
        ],

我能够提取其他详细信息,如标题、作者姓名等。但这似乎有点棘手。

对不起,如果这是一个愚蠢的问题。

【问题讨论】:

  • (articleids.filter(a => a.idtype === 'doi').pop() || {}).value 假设最多有一个 idtype === 'doi'

标签: javascript json pubmed


【解决方案1】:

所以,假设这是您的整个 JSON 字符串。

var json = '{"articleids": [
    { "idtype": "pubmed", "idtypen": 1, "value": "15674886" },
    { "idtype": "doi", "idtypen": 3, "value": "10.1002/14651858.CD001801.pub2" },
    { "idtype": "rid", "idtypen": 8, "value": "15674886" },
    { "idtype": "eid", "idtypen": 8, "value": "15674886" }
]}';

现在我们要解析这个并将其放入一个对象中。

var arr = JSON.parse(json);

要根据项目的值获取特定对象,我们将要使用.filter()。我们将使用.pop() 返回返回数组的第一个元素,在这种情况下,它应该是唯一返回的对象。

var doi = arr.articleids.filter(function(v)
{
    return v.idtype == "doi";
}).pop();

变量doi 现在将保存过滤后的对象。

idtype: "doi"
idtypen: 3
value: "10.1002/14651858.CD001801.pub2"

【讨论】:

  • 谢谢弗拉克斯。没有意识到 $.parseJSON() 在 JQuery 3 中已被弃用。他们现在将其用作 JSON.parse() 的别名。
  • 不客气 :) 很好的解释,顺便说一句。但是,您可以使用箭头函数来简化并提高可读性。我没有将它添加到编辑中,因为它是一个不太明显的修复 - 旧语法的可移植性仍然是保留它的有效参数。
  • 据我所知,IE11 不支持箭头函数,这可能是目前很多人不使用它的一个原因。意见可能不同,但我知道在我的工作中,我们有很多客户仍在使用 IE10。 kangax.github.io/compat-table/es6
  • 是的,没错。但是,可以使用 Babel 或 Closure Compiler 来获得新的语法和可移植性。 (我不是说你应该改变你的答案,只是传播这个词)
  • 如果有人想知道我们在这里谈论的是什么替代方案。这是使用上述代码的示例。这将取代我们设置变量 doi 的位置。 var doi = arr.articleids.filter(v => v.idtype == "doi").pop();
【解决方案2】:

试试这个:

var jsonObj = {
	"articleids": [{
			"idtype": "pubmed",
			"idtypen": 1,
			"value": "15674886"
		},
		{
			"idtype": "doi",
			"idtypen": 3,
			"value": "10.1002/14651858.CD001801.pub2"
		},
		{
			"idtype": "rid",
			"idtypen": 8,
			"value": "15674886"
		},
		{
			"idtype": "eid",
			"idtypen": 8,
			"value": "15674886"
		}
	]
};

var res = jsonObj.articleids.filter(obj => obj.idtype == 'doi');

console.log(res[0]); // {idtype: "doi", idtypen: 3, value: "10.1002/14651858.CD001801.pub2"}

【讨论】:

  • 谢谢@Rohit。我使用了上面 Thomas 的答案。
【解决方案3】:

在您的示例中,值“doi”可以引用为:

articleids[1].idtype

这是一个您可以自己使用的示例。

注意:我将您的数据结构包装在一个名为 obj

的对象中
var obj = {
    "articleids": [{
        "idtype": "pubmed",
        "idtypen": 1,
        "value": "15674886"
    }, {
        "idtype": "doi",
        "idtypen": 3,
        "value": "10.1002/14651858.CD001801.pub2"
    }, {
        "idtype": "rid",
        "idtypen": 8,
        "value": "15674886"
    }, {
        "idtype": "eid",
        "idtypen": 8,
        "value": "15674886"
    }]
}

//access doi
obj.articleids[1].idtype // -> 'doi'

//loop throigh idTypes and log them to the console
obj.articleids.forEach(function(article) {
    console.log(article.idtype)
}) 

JSON 允许您访问 [括号] 中的键,但您也可以使用 '.'当您有一个字符串作为对象键时的属性访问器。给定:

var me = {"name":"AK"}

AK可以引用为

me["name"]

me.name

【讨论】:

  • 您假设articleids 有一个idtype === 'doi' 成员,并且它始终是第二个元素。
  • 我现在看到了我的答案的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2021-06-02
  • 2016-03-12
  • 2021-07-01
  • 1970-01-01
  • 2021-11-09
  • 2017-01-06
相关资源
最近更新 更多