Android 混合对象类型的Gson反序列化
我有一个JSON:Android 混合对象类型的Gson反序列化,android,json,gson,Android,Json,Gson,我有一个JSON: "account_representatives": [ { "Sales Person": 1307, "default_ticket_assignments": [ "" ], "Primary Account Manager": 1307, "Secondary Support-3": 1151, "Relationship Mgr": 130
"account_representatives": [
{
"Sales Person": 1307,
"default_ticket_assignments": [
""
],
"Primary Account Manager": 1307,
"Secondary Support-3": 1151,
"Relationship Mgr": 1307,
"authorized_resources": [
""
],
"Technical Account Manager": 164
}
]
我有一个类,它的结构如下:
public class AccountRepresentative {
@SerializedName("authorized_resources")
@Expose
private List<String> authorizedResources = new ArrayList<String>();
@SerializedName("default_ticket_assignments")
@Expose
private List<String> defaultTicketAssignments = new ArrayList<String>();
@Expose
private Map<String, String> repFields;
/**
* @return The authorizedResources
*/
public List<String> getAuthorizedResources() {
return authorizedResources;
}
/**
* @param authorizedResources The authorized_resources
*/
public void setAuthorizedResources(List<String> authorizedResources) {
this.authorizedResources = authorizedResources;
}
/**
* @return The defaultTicketAssignments
*/
public List<String> getDefaultTicketAssignments() {
return defaultTicketAssignments;
}
/**
* @param defaultTicketAssignments The default_ticket_assignments
*/
public void setDefaultTicketAssignments(List<String> defaultTicketAssignments) {
this.defaultTicketAssignments = defaultTicketAssignments;
}
/**
*
* @return the dynamic jsonObjects
*/
public Map<String, String> getRepFields() {
return repFields;
}
/**
* @param repFields The repFields
*/
public void setRepFields(Map<String, String> repFields) {
this.repFields = repFields;
}
}
我使用GSON绑定这些,我能够绑定2个jsonarray
我还可以使用
但在这种情况下,我不知道如何获得动态特性,
我的计划应该是将动态属性转换为hashmap,但是2个JSONArray挡住了我的去路
感谢您的帮助,我已经了解了如何使用GSON自定义反序列化器,感谢这篇文章,也感谢这篇文章, 我所做的是创建此自定义反序列化程序:
package com.xxx.xyz.models;
import android.util.Log;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class AccountRepresentativeDeserializer implements JsonDeserializer<AccountDetailsModel.AccountRepresentative> {
@Override
public AccountDetailsModel.AccountRepresentative deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Log.v("AUTHORIZED REP ", json.toString());
AccountDetailsModel.AccountRepresentative accountRep = new AccountDetailsModel().new AccountRepresentative();
JsonObject jObject = json.getAsJsonObject();
Set<Entry<String, JsonElement>> items = jObject.entrySet();
Iterator<Entry<String, JsonElement>> it = items.iterator();
Map<String, String> repFields = new HashMap<>();
while (it.hasNext()) {
Entry<String, JsonElement> i = it.next();
if (i.getKey().equals("default_ticket_assignments")) {
ArrayList<String> defaultTicketAssignments = new ArrayList<>();
JsonArray defTicketAssignment = i.getValue().getAsJsonArray();
Iterator<JsonElement> defTicketIterator = defTicketAssignment.iterator();
while (defTicketIterator.hasNext()) {
JsonElement defTicketItem = defTicketIterator.next();
defaultTicketAssignments.add(defTicketItem.getAsString());
}
accountRep.setDefaultTicketAssignments(defaultTicketAssignments);
} else if (i.getKey().equals("authorized_resources")) {
ArrayList<String> authorizedResources = new ArrayList<>();
JsonArray authorizedRes = i.getValue().getAsJsonArray();
Iterator<JsonElement> authorizedResIterator = authorizedRes.iterator();
while (authorizedResIterator.hasNext()) {
JsonElement defTicketItem = authorizedResIterator.next();
authorizedResources.add(defTicketItem.getAsString());
}
accountRep.setAuthorizedResources(authorizedResources);
} else {
repFields.put(i.getKey(), i.getValue().getAsString());
}
}
accountRep.setRepFields(repFields);
return accountRep;
}
}
顺便说一句,
AccountRepresentation是一个内部类,AccountRepresentation中的两个数组始终在JSON中,只有属性是动态的
我原以为我无法解析内部代码并为AccountDetailModel本身创建自定义反序列化程序,但我尝试为AccountRepresentative创建反序列化程序,结果一切正常:您的意思是,您不确定“键值对”中的键?它可以在没有事先通知的情况下改变吗?是的。。这些键是动态的,所以我无法在飞行中抓取它们。您可能想查看以下链接:它解决了相同的问题,但允许您使用@JsonAdapterYourDeserialiser.class注释删除一些样板文件,您可以将这些注释添加到模型类中。这样,您就不需要向构建器注册反序列化程序。
Gson gson = new GsonBuilder().registerTypeAdapter(AccountDetailsModel.AccountRepresentative.class, new AccountRepresentativeDeserializer()).create();
AccountDetailsModel result = gson.fromJson(strResult, AccountDetailsModel.class);