【问题标题】:Google Admin SDK: Directory Users: How to get User phone numbers using Java client?Google Admin SDK:目录用户:如何使用 Java 客户端获取用户电话号码?
【发布时间】:2014-08-28 19:19:10
【问题描述】:

我使用服务帐户成功进行了身份验证,并且可以列出我公司的 Google 目录中的用户。

但是我想列出用户的电话号码。

我使用了java quickstart example code,它可以工作。但是它只打印用户的主要电子邮件地址。

我想使用 User.getPhones() 方法来获取每个用户的电话号码列表/数组,但 Java API 返回“对象”,请参阅the Google java API

我知道 Google 请求的真正结果是 JSON,并且用户有一个电话数组,它们有一个“类型”和一个“值”,例如 work: num (Admin SDK User Representation)

我知道 google Java 客户端正在使用 Google 特定的 Jackson2 实现,

com.google.api.client.json.jackson2.JacksonFactory

如何影响它生成 UserPhone 对象而不仅仅是 java.lang.Object?

干杯 卡尔

【问题讨论】:

  • 更新:我试图将 User.getPhones 的结果转换为 UserPhone 对象数组,但结果表明对于所有用户,该值都是空的。如果我查看我的 gmail -> 联系人 -> 目录,我可以看到一些有电话号码的用户。我现在想知道用户电话号码是否存储在不同的 API 中?有什么想法吗?

标签: jackson google-api-java-client google-admin-sdk


【解决方案1】:

我想出了以下方法来转换 Admin SDK 中的 ArrayMaps<String,Object> 对象的通用 List。 它需要以下导入:

import com.google.api.client.json.GenericJson;
import com.google.api.client.util.ArrayMap;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

下面是解析的方法:

public <T extends GenericJson> List<T> parse(Object genericItem, Class<T> clazz){
     List<T> result = new ArrayList<T>();
     if (genericItem != null){
         try {
             Constructor<T> constructor = clazz.getConstructor(new Class[0]);    // find the default constructor of the input class type
             List<ArrayMap<String,Object>> objects = (List<ArrayMap<String,Object>>)genericItem;
             for (ArrayMap<String,Object> object: objects){
                T id = constructor.newInstance(); // call the default constructor
                for (int i = 0; i < object.size(); i++)
                    id.put(object.getKey(i), object.getValue(i));
                result.add(id);
            }
        } catch (NoSuchMethodException ex) {
               Logger.getLogger(ListArrayMapParser.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(ListArrayMapParser.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(ListArrayMapParser.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(ListArrayMapParser.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalArgumentException ex) {
            Logger.getLogger(ListArrayMapParser.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(ListArrayMapParser.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    return result;
}

这样工作:

List<UserPhone> phones = parser.parse(user.getPhones(), UserPhone.class);
List<UserExternalId> externalIds = parser.parse(user.getExternalIds(),    UserExternalId.class);
List<UserOrganization> organizations = parser.parse(user.getOrganizations(), UserOrganization.class);
List<UserEmail> userEmails = parser.parse(user.getEmails(), UserEmail.class); 

完成此操作后,您可以更新电话、externalIds...,然后执行user.setPhones(phones),用户对象将在保存时很好地处理新对象。

我认为您今天不能让 API 自动为您返回解析结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多