Retrofit - 如何定义 hashmap gson 响应?
Retrofit - How do define hashmap gson response?
我已经看过这个 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 but was BEGIN_ARRAY"。根据这个 post 我的语法是正确的。但我更喜欢 Jake Wharton 的解决方案(来自另一个 post 提到的),它实际上是一个 hashmap
Map<String, List<User>>
但是将联系人对象更改为使用 Hashmap 会给我以下错误:"Expected BEGIN_ARRAY but was BEGIN_OBJECT"。所以请帮我弄清楚如何使用改造和 robospice 来定义对象。
已编辑:
我正在使用 robospice,所以我有这个:
@Override
public Contacts loadDataFromNetwork() throws Exception {
final AlertPolicies[] myIncidents = {null};
return getService().getContacts();
}
并且在 activity 中我在 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);
}
}
}
Contacts 始终为 null,如果我查看它显示的响应 "Retrofit Expected BEGIN_OBJECT but was BEGIN_ARRAY" 并按照我上面解释的那样尝试另一种方式,则会给我另一个错误。
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);
}
}
}
谢谢,但我认为根本不必使用回调的诀窍实际上是:
@SerializedName("contacts")
public List<User> contacts;
但我会记住你的哈希图。
我已经看过这个 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 but was BEGIN_ARRAY"。根据这个 post 我的语法是正确的。但我更喜欢 Jake Wharton 的解决方案(来自另一个 post 提到的),它实际上是一个 hashmap
Map<String, List<User>>
但是将联系人对象更改为使用 Hashmap 会给我以下错误:"Expected BEGIN_ARRAY but was BEGIN_OBJECT"。所以请帮我弄清楚如何使用改造和 robospice 来定义对象。
已编辑:
我正在使用 robospice,所以我有这个:
@Override
public Contacts loadDataFromNetwork() throws Exception {
final AlertPolicies[] myIncidents = {null};
return getService().getContacts();
}
并且在 activity 中我在 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);
}
}
}
Contacts 始终为 null,如果我查看它显示的响应 "Retrofit Expected BEGIN_OBJECT but was BEGIN_ARRAY" 并按照我上面解释的那样尝试另一种方式,则会给我另一个错误。
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);
}
}
}
谢谢,但我认为根本不必使用回调的诀窍实际上是:
@SerializedName("contacts")
public List<User> contacts;
但我会记住你的哈希图。