Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从JSON响应中提取对象属性_Json_Google Apps Script - Fatal编程技术网

如何从JSON响应中提取对象属性

如何从JSON响应中提取对象属性,json,google-apps-script,Json,Google Apps Script,我有大量的书,我想建立一个数据库来管理它们。我的想法是扫描他们所有的条形码,将它们放在谷歌表单中,然后使用OpenLibrary API检索相应的元数据(标题、作者等),以避免全部输入 API结构非常简单,我可以通过传递条形码(ISBN编号)来检索信息: 但响应的JSON结构给我带来了麻烦: { "ISBN:9782505061373": { "url": "https://openlibrary.org/books/OL

我有大量的书,我想建立一个数据库来管理它们。我的想法是扫描他们所有的条形码,将它们放在谷歌表单中,然后使用OpenLibrary API检索相应的元数据(标题、作者等),以避免全部输入

API结构非常简单,我可以通过传递条形码(ISBN编号)来检索信息:

但响应的JSON结构给我带来了麻烦:

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