Как извлечь конкретное значение из этого вывода json

Я пытаюсь декодировать вывод 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"
            }
        ],

Мне удалось извлечь другие детали, такие как название, имя автора и т. Д. Но это кажется немного сложным.

Извините, если это глупый вопрос.


person Queen Sarah    schedule 15.05.2018    source источник
comment
(articleids.filter(a => a.idtype === 'doi').pop() || {}).value при условии, что существует не более одного idtype === 'doi'   -  person Ele    schedule 16.05.2018


Ответы (3)


Итак, предположим, что это вся ваша строка 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"
person Thomas    schedule 15.05.2018
comment
Спасибо, Фракс. Не осознавал, что $.parseJSON() устарел с JQuery 3. Теперь они используют его как псевдоним JSON.parse(). - person Thomas; 16.05.2018
comment
Пожалуйста :) Хорошее объяснение, кстати. Однако вы можете использовать стрелочную функцию для краткости и удобства чтения. Я не добавил его в правку, потому что это менее очевидное исправление - переносимость старого синтаксиса по-прежнему является веским аргументом в пользу его сохранения. - person Frax; 16.05.2018
comment
Насколько мне известно, IE11 не поддерживает стрелочные функции, что, вероятно, является причиной для многих не использовать его на данный момент. Мнения могут отличаться, но я знаю, что по работе у нас много клиентов, которые все еще используют IE10. kangax.github.io/compat-table/es6 - person Thomas; 16.05.2018
comment
Ага, правда. Однако можно использовать Babel или Closure Compiler, чтобы получить как новый синтаксис, так и переносимость. (Я не говорю, что вы должны изменить свой ответ, просто распространяю информацию) - person Frax; 16.05.2018
comment
На случай, если кому-то может быть интересно, о какой альтернативе мы здесь говорим. Вот пример с использованием приведенного выше кода. Это заменит место, где мы устанавливаем переменную doi. var doi = arr.articleids.filter(v => v.idtype == "doi").pop(); - person Thomas; 16.05.2018
comment
Большое спасибо Томасу и @Frax за вашу помощь. Код работал как шарм. - person Queen Sarah; 16.05.2018

Попробуйте это:

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"}

person Rohit Jindal    schedule 16.05.2018
comment
Спасибо @Rohit. Я использовал ответ Томаса выше. - person Queen Sarah; 16.05.2018

В вашем примере на значение 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"]

or

me.name

person A K    schedule 15.05.2018
comment
Вы предполагаете, что у articleids есть член с idtype === 'doi', и это всегда второй элемент. - person Tibrogargan; 16.05.2018
comment
Теперь я вижу ошибку своего ответа. - person A K; 16.05.2018