如何从JSON响应中提取对象属性
我有大量的书,我想建立一个数据库来管理它们。我的想法是扫描他们所有的条形码,将它们放在谷歌表单中,然后使用OpenLibrary API检索相应的元数据(标题、作者等),以避免全部输入 API结构非常简单,我可以通过传递条形码(ISBN编号)来检索信息: 但响应的JSON结构给我带来了麻烦:如何从JSON响应中提取对象属性,json,google-apps-script,Json,Google Apps Script,我有大量的书,我想建立一个数据库来管理它们。我的想法是扫描他们所有的条形码,将它们放在谷歌表单中,然后使用OpenLibrary API检索相应的元数据(标题、作者等),以避免全部输入 API结构非常简单,我可以通过传递条形码(ISBN编号)来检索信息: 但响应的JSON结构给我带来了麻烦: { "ISBN:9782505061373": { "url": "https://openlibrary.org/books/OL
{
"ISBN:9782505061373": {
"url": "https://openlibrary.org/books/OL32231855M/Undertaker_-_Tome_1_-_Le_Mangeur_d'or",
"key": "/books/OL32231855M",
"title": "Undertaker - Tome 1 - Le Mangeur d'or",
"authors": [
{
"url": "https://openlibrary.org/authors/OL8653266A/Xavier_Dorison",
"name": "Xavier Dorison"
},
{
"url": "https://openlibrary.org/authors/OL9159488A/Ralph_Meyer",
"name": "Ralph Meyer"
}
],
"number_of_pages": 56,
"identifiers": {
"isbn_10": [
"2505061378"
],
"isbn_13": [
"9782505061373"
],
"openlibrary": [
"OL32231855M"
]
},
"publishers": [
{
"name": "DARGAUD"
}
],
"publish_date": "Jan 30, 2015",
"notes": "Source title: Undertaker - Tome 1 - Le Mangeur d'or (Undertaker, 1) (French Edition)",
"cover": {
"small": "https://covers.openlibrary.org/b/id/10867977-S.jpg",
"medium": "https://covers.openlibrary.org/b/id/10867977-M.jpg",
"large": "https://covers.openlibrary.org/b/id/10867977-L.jpg"
}
}
}
在不需要硬编码的情况下检索第一个对象的属性(ISBN:…)的正确语法是什么,因为它对于每个查询都是动态变化的
例如,如果我正在检索标题,我将使用
results["ISBN:9782505061373"]["title"];
但是我能做些什么来自动检索对象的“ISBN:…”部分呢
然后,我的目标是将选定属性的值作为数组写入工作表中
我正在改编我在网上找到的为GoogleBooksAPI编写的代码片段。但是我发现我的很多书都不在谷歌图书中,我想改用OpenLibrary
下面是部分改编的完整片段。我正在尝试使用属性调整部分,以匹配OpenLibrary提供的内容以及与我相关的内容。如果你还有其他建议,我洗耳恭听:-)
非常感谢你的支持
s = SpreadsheetApp.getActiveSheet();
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('ISBN')
.addItem('Chercher par ISBN', 'getBookDetails')
.addToUi();
}
function getBookDetails(numisbn) {
// Query the book database by ISBN code.
activeCell = s.getActiveCell();
value = activeCell.getValue();
numisbn = numisbn || value.toString();
// Not a valid ISBN if not 13 or 10 digits long.
if(numisbn.match(/(\d{13}|\d{10})/) == null){
throw new Error( "Not a valid ISBN: " + numisbn);
}
var url = "https://openlibrary.org/api/books?bibkeys=ISBN:" + numisbn +"&jscmd=data&format=json";
var results = UrlFetchApp.fetch(url);
if (results.totalItems) {
// There'll be only 1 book per ISBN
var book = results.items[0];
var title = (book["volumeInfo"]["title"]);
var subtitle = (book["volumeInfo"]["subtitle"]);
var authors = (book["volumeInfo"]["authors"]);
var printType = (book["volumeInfo"]["printType"]);
var pageCount = (book["volumeInfo"]["pageCount"]);
var publisher = (book["volumeInfo"]["publisher"]);
var publishedDate = (book["volumeInfo"]["publishedDate"]);
var webReaderLink = (book["accessInfo"]["webReaderLink"]);
}
s.getRange(activeCell.getRow(), activeCell.getColumn() + 1, 1, results[0].length).setValues(results);
}
解决方案: 由于您有一个传递给API的ISBN变量,因此可以使用相同的变量计算属性名称并将其用作引用:
results["ISBN:" + numisbn]["title"];
这是可能的,因为ES6JavaScript
参考资料:
我假设我们从以下几行开始:
var url=”https://openlibrary.org/api/books?bibkeys=ISBN:“+numisbn+”&jscmd=data&format=json”;
var response=UrlFetchApp.fetch(url);
我假设您收到的JSON如下所示:
{
“ISBN:97825050611373”:{
“url”:”https://openlibrary.org/books/OL32231855M/Undertaker_-_Tome_1_-_Le_Mangeur_d“或”,
“密钥”:“/图书/OL32231855M”,
“标题”:“殡仪馆-第一册-Le Mangur d'or”,
“作者”:[{
“url”:”https://openlibrary.org/authors/OL8653266A/Xavier_Dorison",
“姓名”:“泽维尔·多里森”
}, {
“url”:”https://openlibrary.org/authors/OL9159488A/Ralph_Meyer",
“姓名”:“拉尔夫·迈耶”
}],
“页数”:56页,
“标识符”:{
“isbn_10”:[“2505061378”],
“isbn_13”:[“97825050611373”],
“openlibrary”:[“OL32231855M”]
},
“出版商”:[{
“名称”:“达高”
}],
“发布日期”:“2015年1月30日”,
“注释”:“来源标题:殡仪馆-第一册-第二册(殡仪馆,1)(法文版)”,
“封面”:{
“小”:https://covers.openlibrary.org/b/id/10867977-S.jpg",
“中等”:https://covers.openlibrary.org/b/id/10867977-M.jpg",
“大”:https://covers.openlibrary.org/b/id/10867977-L.jpg"
}
}
}
从这里,您可以访问HTTP响应对象的JSON负载,如下所示:
var results=JSON.parse(response.getContentText());
上面的一行将响应读入包含JSON数据的字符串,然后将其解析为JavaScript对象
您需要获取用于嵌入对象键的名称“ISBN:97825050611373”
。为此,请使用以下命令:
让isbnKey=Object.keys(结果)[0];
Object.keys()
函数获取所有提供的键-但在我们的例子中,我们假设始终只有一个这样的键
现在我们有了isbnKey
包含字符串ISBN:97825050611373
我们可以使用以下方法深入了解详细信息:
让isbnUrl=results[isbnKey].url;
让title=results[isbnKey].title;
。。。依此类推。这里有一个用于检索json中所有数据的解决方案。希望它能满足你的需要
let resultat = [];
/**
* Permet d'explorer un json.
* Retourne attribut ou objet / valeur
*
* @param {texte ou cellule} url url du site hébergeant le json ou cellule de la feuille contenant le json
* @customfunction
*/
function getISBNInfos(url) {
var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
resultat.push(['niveau','champs','valeurs']);
getData(1,eval(data),'data')
return resultat
}
function getData(niv,obj,id) {
const regex = new RegExp('[^0-9]+');
for (let p in obj) {
var newid = (regex.test(p)) ? id + '.' + p : id + '[' + p + ']';
if (obj[p]!=null){
if (typeof obj[p] != 'object' && typeof obj[p] != 'function'){
resultat.push([niv, p, obj[p]]);
}
if (typeof obj[p] == 'object') {
if (obj[p].length){
resultat.push([niv, p + '[0-' +(obj[p].length-1)+ ']', '']);
}else{
resultat.push([niv, p, '']);
}
niv+=1;
getData(niv, obj[p], newid );
niv-=1
}
}
}
}
复印一份
let resultat = [];
/**
* Permet d'explorer un json.
* Retourne attribut ou objet / valeur
*
* @param {texte ou cellule} url url du site hébergeant le json ou cellule de la feuille contenant le json
* @customfunction
*/
function getISBNInfos(url) {
var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
resultat.push(['niveau','champs','valeurs']);
getData(1,eval(data),'data')
return resultat
}
function getData(niv,obj,id) {
const regex = new RegExp('[^0-9]+');
for (let p in obj) {
var newid = (regex.test(p)) ? id + '.' + p : id + '[' + p + ']';
if (obj[p]!=null){
if (typeof obj[p] != 'object' && typeof obj[p] != 'function'){
resultat.push([niv, p, obj[p]]);
}
if (typeof obj[p] == 'object') {
if (obj[p].length){
resultat.push([niv, p + '[0-' +(obj[p].length-1)+ ']', '']);
}else{
resultat.push([niv, p, '']);
}
niv+=1;
getData(niv, obj[p], newid );
niv-=1
}
}
}
}