我看过这个post,需要澄清一下。
我有一个看起来像这样的结构:
{
"contacts": [
{
"account_id": 3599,
"created_at": 1427556844,
"name": "John Smith",
},
{
"account_id": 3599,
"created_at": 1427155837,
"name": "Carl Johnson",
}
]
}
我用这种方式创造了它:
public class Contacts {
@SerializedName("contacts")
public List<User> contacts;
}
public class User {
@SerializedName("account_id")
int accountId;
@SerializedName("created_at")
String createdAt;
@SerializedName("name")
String name;
}
但是当我尝试通过改造来运行它时,我得到“Retrofit Expected BEGIN_OBJECT但是BEGIN_ARRAY”。根据这篇文章我的语法是正确的。但我更多的是Jake Whartons解决方案(来自其他帖子),这里它实际上是一个hashmap
Map<String, List<User>>
但是更改联系人对象以使用Hashmap会给我以下错误:“预期BEGIN_ARRAY但是BEGIN_OBJECT”。所以请帮我弄清楚如何使用改造和robospice来定义对象。
编辑:
我正在使用robospice,所以我有这个:
@Override
public Contacts loadDataFromNetwork() throws Exception {
final AlertPolicies[] myIncidents = {null};
return getService().getContacts();
}
在我在onStart()中定义的活动中:
spiceManager.execute(contactsRequest, CACHE_KEY, DurationInMillis.ONE_MINUTE, new ContactsRequestListener());
和听众这样:
private final class ContactsRequestListener implements RequestListener<Contacts> {
@Override
public void onRequestFailure(SpiceException spiceException) {
if(Constant.DEBUG) Log.d(TAG, "onRequestFailure: " + spiceException.getMessage());
Toast.makeText(ContactsActivity.this, "failure", Toast.LENGTH_SHORT).show();
}
@Override
public void onRequestSuccess(Contacts contacts) {
if(Constant.DEBUG) Log.d(TAG, "onRequestSuccess");
Toast.makeText(AlertPoliciesActivity.this, "success", Toast.LENGTH_SHORT).show();
if(contacts != null) {
updateContacts(contacts);
}
}
}
联系人始终为空,如果我查看响应,它会显示“Retrofit Expected BEGIN_OBJECT但是BEGIN_ARRAY”并尝试另一种方式,正如我上面解释的那样给了我另一个错误。
答案 0 :(得分:0)
HashMap<Integer,User> hash=new HashMap();
@Override
public void onRequestSuccess(Contacts contacts) {
if(Constant.DEBUG) Log.d(TAG, "onRequestSuccess");
Toast.makeText(AlertPoliciesActivity.this, "success", Toast.LENGTH_SHORT).show();
if(contacts != null) {
for(int i=0;i<contacts.size();i++){
hash.put(contacts.contacts.get(i).accountId,contacts.contacts);
}
}
}
答案 1 :(得分:0)
谢谢,但我觉得这个诀窍,根本就没有使用回调,实际上是:
@SerializedName("contacts")
public List<User> contacts;
但我会记住你的hashmap。