Jackson 谷歌管理员SDK:目录用户:如何使用Java客户端获取用户电话号码?

Jackson 谷歌管理员SDK:目录用户:如何使用Java客户端获取用户电话号码?,jackson,google-api-java-client,google-admin-sdk,Jackson,Google Api Java Client,Google Admin Sdk,我使用服务帐户成功地进行了身份验证,并且可以在我公司的Google目录中列出用户 不过,我想列出用户的电话号码 我用了这个工具,它很管用。但是,它只打印用户的主要电子邮件地址 我想使用User.getPhones()方法获取每个用户的电话号码列表/数组,但Java API返回“Object”,请参见 我知道Google请求的真正结果是JSON,用户有一个电话数组,其中有一个“type”和一个“value”,例如work:num() 我知道google Java客户端使用的是特定于google的J

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

不过,我想列出用户的电话号码

我用了这个工具,它很管用。但是,它只打印用户的主要电子邮件地址

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

我知道Google请求的真正结果是JSON,用户有一个电话数组,其中有一个“type”和一个“value”,例如work:num()

我知道google Java客户端使用的是特定于google的Jackson2实现

com.google.api.client.json.jackson2.JacksonFactory
我如何影响它来生成UserPhone对象,而不仅仅是java.lang.Object

干杯
Karl

我提出了以下方法,用于翻译Admin SDK中
对象的
数组映射的通用
列表。
它需要以下导入:

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;
}
公共列表解析(对象泛型项,类clazz){
列表结果=新建ArrayList();
if(genericItem!=null){
试一试{
构造函数Constructor=clazz.getConstructor(新类[0]);//查找输入类类型的默认构造函数
列表对象=(列表)通用项;
对于(ArrayMap对象:对象){
T id=constructor.newInstance();//调用默认构造函数
对于(int i=0;i
其工作原理如下:

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); 
List phones=parser.parse(user.getPhones(),UserPhone.class);
List externalIds=parser.parse(user.getExternalIds(),UserExternalId.class);
List organizations=parser.parse(user.getOrganizations(),UserOrganization.class);
List userEmails=parser.parse(user.getEmails(),UserEmail.class);
一旦你做到了这一点,你可以更新手机,外部ID,。。。然后执行
user.setPhones(phones)
,用户对象将在保存时很好地处理新对象


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

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