Kar*_*arl 3 jackson google-api-java-client google-admin-sdk
我使用服务帐户成功进行了身份验证,并且可以在我公司的 Google 目录中列出用户。
但是我想列出用户的电话号码。
我使用了java 快速入门示例代码,它可以工作。但是,它仅打印用户的主要电子邮件地址。
我想使用 User.getPhones() 方法来获取每个用户的电话号码列表/数组,但 Java API 返回“对象”,请参阅Google java API
我知道 Google 请求的真正结果是 JSON,并且用户有一个具有“类型”和“值”的电话数组,例如 work: num ( Admin SDK User Representation )
我知道谷歌 Java 客户端正在使用谷歌特定的 Jackson2 实现,
com.google.api.client.json.jackson2.JacksonFactory
Run Code Online (Sandbox Code Playgroud)
我如何影响它以生成 UserPhone 对象而不仅仅是 java.lang.Object?
干杯卡尔
我想出了下面的方法翻译一般List的ArrayMaps的<String,Object>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;
Run Code Online (Sandbox Code Playgroud)
这是进行解析的方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
这像这样工作:
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);
Run Code Online (Sandbox Code Playgroud)
完成此操作后,您可以更新电话、externalIds...,然后执行user.setPhones(phones)此操作,用户对象将在保存时很好地处理新对象。
我认为您今天无法让 API 自动返回解析结果。
| 归档时间: |
|
| 查看次数: |
1402 次 |
| 最近记录: |