【问题标题】:Get value from Javascript JSON object by referencing specific property name通过引用特定属性名称从 Javascript JSON 对象中获取值
【发布时间】:2014-09-19 01:46:58
【问题描述】:

我正在使用 Google Apps 脚本 (Javascript) 来检索使用 Google Apps Admin SDK Directory API 中的 Users.get method 的用户的详细信息。

获取用户的代码是:

var url = 'https://www.googleapis.com/admin/directory/v1/users/'+email+'?key='+publicApiAccessKey;
var scope = "https://www.googleapis.com/auth/admin.directory.user.readonly";

var fetchArgs = googleOAuth_("Users",scope);
fetchArgs.method = "GET";
fetchArgs.muteHttpExceptions=true;

var userObject = UrlFetchApp.fetch(url, fetchArgs);

响应是 Google Apps Admin SDK User resource 和以下格式的对象:

{
  "kind": "admin#directory#user",
  "id": string,
  "etag": etag,
  "primaryEmail": string,
  "name": {
    "givenName": string,
    "familyName": string,
    "fullName": string
  },
  "isAdmin": boolean,
  "isDelegatedAdmin": boolean,
  "lastLoginTime": datetime,
  // rest of the properties excluded
}

我如何获得 fullName 的值?

这是我迄今为止尝试过的,但没有成功:

Logger.log( Object.prototype.toString.call(userObject) ); // returns [object JavaObject]
Logger.log( userObject.name.fullName ); // Cannot read property "fullName" from undefined.
Logger.log( userObject.fullName ); // undefined
Logger.log( userObject.name ); // undefined
Logger.log( userObject['fullName'] ); // undefined
Logger.log( userObject['name'] ); // undefined
Logger.log( userObject['name','fullName'] ); // undefined

【问题讨论】:

  • userObject 显然不是所描述的对象。如果是,那么您的userObject.name.fullName 将是正确的。我建议Logger.log(userObject); 和/或for (var name in userObject) { Logger.log(name); } 和/或Object.prototype.toString.call(userObject); 弄清楚它是什么。例如,它可以是一个 array 吗? typeof anArray 返回"object"。我不明白为什么它会返回一个数组,但是...
  • 嗯,好的。 Object.prototype.toString.call(userObject) 返回 [object JavaObject]for (var name in userObject) { Logger.log(name); } 似乎只是列出了对象的方法(与我在键入 userObject 后跟一个点时得到的自动完成代码建议相同:[14-07-27 17:21:45:843 EDT] getResponseCode [14-07-27 17:21:45:843 EDT] getContentText [14-07-27 17:21:45:844 EDT] getContent [14-07-27 17:21:45:844 EDT] getAs [14-07-27 17:21:45:844 EDT] getHeaders [14-07-27 17:21:45:844 EDT] getBlob [14-07-27 17:21:45:845 EDT] toString [14-07-27 17:21:45:845 EDT] getAllHeaders
  • 旁注:如果它已被反序列化(并且如果typeof 表示除"string" 以外的任何内容),它就不再是“JSON 对象”了。它是一个对象。 JSON 是一种用于数据交换的文本表示法。
  • 不,与Java无关,但不确定是否与GWT有关。我在 Google Apps Script 脚本编辑器中运行此代码,该编辑器基本上是沙盒化的 Javascript。令我困惑的是,在the documentation for this get method 中,它只是说如果成功,此方法在响应正文中返回一个用户资源。,描述资源的页面显示“使用以下 JSON 模板用于 Directory API 中的用户资源”,但没有告诉您如何从中检索值。
  • 找到它:(developers.google.com/apps-script/reference/url-fetch/…)。让我读一下这个。

标签: javascript json object google-apps-script google-admin-sdk


【解决方案1】:

根据您对这个问题的评论,我怀疑您做了这样的事情:

var userObject = Users.get(/*...args...*/);

...在您用来获取响应的任何层中,因此userObject 不是用户对象,它是某种形式的自定义 XHR 类对象。您链接到的文档专门是 Java 和 Python,而不是浏览器端。 (当然,除非使用 Java 小程序。)

检查该文档,很可能它希望您提供回调/lambda 或调用该对象上的方法(getContent 看起来很诱人)以获得实际响应。

【讨论】:

  • 更新了我的原始问题以包括返回对象的 API 调用,以便澄清。 userObject.getContent() 返回一个整数数组(奇怪),也许它们是字符串长度? userObject.getContentText() 返回对象的文本,但为 [object String] 类型。我要去看看能不能找到这些类型的对象的 Google Apps 脚本文档。
  • 弄清楚了:HTTP GET 请求响应包含 JSON 表示法的数据,但需要先对其进行解析,并且 Google Apps Script 有一个名为 JSON.parse 的内置 JSON 解析库,我了解到关于here。感谢您为我指出正确的方向,帮助我意识到它不是有效的 Object 类型。
  • @mike:不客气!我建议您发布正确的方法来处理呼叫作为答案,并在 SO 允许您的几天内接受您的答案。上面让你开始了,但是你把它弄到了终点线,从你上面描述的内容来看,上面是不完整的(例如,对于其他人将来会发现)。 :-)
【解决方案2】:

作为 T.J.帮助我发现,Google Apps 脚本 UrlFetchApp.fetch() 方法不返回 Javascript 对象。它返回基本上是以 JSON 表示法构造的字符串,但需要先对其进行解析。 Google Apps Script 中有一个用于解析 JSON 结构字符串的内置库。

这是最终的工作代码:

var url = 'https://www.googleapis.com/admin/directory/v1/users/'+email+'?key='+publicApiAccessKey;
var scope = "https://www.googleapis.com/auth/admin.directory.user.readonly";

var fetchArgs = googleOAuth_("Users",scope);
fetchArgs.method = "GET";
fetchArgs.muteHttpExceptions=false;

var userJson = UrlFetchApp.fetch(url, fetchArgs);

var userObject = JSON.parse(userJson);

var fullName = userObject.name.fullName;

我了解了 JSON.parse() here

【讨论】:

    猜你喜欢
    • 2014-09-23
    • 2021-04-03
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多