如何访问User.getAddresses()和User.getPhones()返回的Java对象中的数据?

时间:2014-10-18 11:37:46

标签: java api

com.google.api.services.admin.directory.model.User中,许多方法(例如getAddresses()getPhones())返回一个我无法弄清楚如何处理的Java对象。

使用toString(),我可以看到我想要的数据在对象中(看起来像HashMaps列表),但我无法弄清楚如何将其转换为我可以访问的表单,例如UserAddressUserPhone

的列表或数组

我也想知道如何构建这样的对象,以便我可以更新用户(虽然我认为我的问题的第一部分的答案可能会使得如何构建它们显而易见)?

我已经能够更新其他不涉及此类对象的内容,因此我一般不需要阅读和更新方面的帮助,但我现在已经在这些对象上苦苦挣扎了几天而且可以'想通了。感谢。

3 个答案:

答案 0 :(得分:2)

Google Directoy API使用JSON进行通信。用于与API通信的Java客户端库解析并将JSON与Java对象串行化,以便在代码中使用。请查看此处了解其工作原理:https://code.google.com/p/google-http-java-client/wiki/JSON

当前版本库的问题在于它没有将User类中的所有字段序列化为可用对象。相反,地图或地图列表用于复杂字段。例如,phones字段应该转换为UserPhone个对象的列表,而是成为一个映射列表。正确序列化的唯一字段是name字段,是UserName对象。

手动将地图转换为正确对象的一种方法是使用像Gson这样的json解析器并解析地图。像这样:

Gson gson = new GsonBuilder().create();

ArrayList phones = (ArrayList) user.getPhones();
for (Object phone : phones) {
    UserPhone userPhone = gson.fromJson(phone.toString(), UserPhone.class);
    System.out.println(userPhone.getType() + "=" + userPhone.getValue());
}

答案 1 :(得分:0)

我相信这些方法会返回一个集合,在这种情况下,您可能希望通过迭代器访问它们包含的项目。这样的事情应该有效:

ListIterator addresses = user.getAddresses().iterator();

while(addresses.hasNext()) {
    Address address = addresses.next();
    // do something with the address
}

如果您不熟悉Iterator对象,本文可能有所帮助:How to use Iterator

答案 2 :(得分:0)

谢谢,但是User.getAddresses()和User.getPhones()没有迭代器方法,因此这里提出的答案都不起作用。

ListIterator addresses = user.getAddresses().iterator();”获取编译器错误“对象类型未定义方法iterator()。”

for (UserAddress addr : user.getAddresses())”获取编译器错误“只能迭代数组或java.lang.Iterable的实例”。

但我终于找到了完成工作的方法。以下代码实际上是有效的,即使很难相信这是我“应该”这样做的方式。

ArrayList<ArrayMap<String,String>> phones = (ArrayList<ArrayMap<String,String>>)user.getPhones();
for (ArrayMap<String,String> phone : phones)
    System.out.println(phone.get("type") + "=" + phone.get("value"));

将数据放入UserPhone的实例会很好,但我无法弄清楚如何做到这一点(除了为每个可能的关键字做一个get&amp; UserPhone.setXxxx)。

我能够通过传递User.setPhones()和我从头开始构建的ArrayList<UserPhone>来更新电话号码。