GSON 预计 BEGIN_ARRAY 但 BEGIN_OBJECT?
GSON Expected BEGIN_ARRAY but was BEGIN_OBJECT?
刚开始学习gson。
我看到很多关于这个错误的话题,但我没有找到任何帮助或对应我的问题的答案。
我正在尝试解析 JSON 字符串,如下所示:
{
"CodeAnalytique": "XXXX",
"Domaine": "XXXX",
"HabilitationAD": [
{
"Key": "XXXX",
"Value": [
{
"Applicatif": "XXXX",
"Cle": "E",
"Role": "Red",
"Valeur": "XXXX"
},
{
"Applicatif": "XXXX",
"Cle": "E",
"Role": "Red",
"Valeur": "XXXX"
}
//lot of other value
]
}
],
"HabilitationInterprete": [
{
"Key": "XX",
"Value": [
{
"Applicatif": "XXXX",
"Cle": "Z",
"Role": "Red",
"Valeur": "XXX"
},
{
"Applicatif": "XXXX",
"Cle": "Z",
"Role": "Red",
"Valeur": "XXXX"
}
//lot of other value
]
}
],
"Identity": "XXXX",
"InfoConsolidee": "Operation requested at XXXX",
"IsAdminI": true,
"IsAdminM": false,
"IsAuthentif": true,
"Matricule": "XXX",
"Nom": "XXXX",
"PasswordEnvoye": "XXXX",
"Prenom": "XXX",
"PrincipalPermissionMode": 1,
"RoleSGBD": [
"xxxx"
],
"RoleSI": [
null,
"APP_02",
"APP_03",
//lot of other value
],
"Societe": "XXX",
"TypeClient": null
}
成对象
InfoSecuriteBean mInfoSecuriteBean = gson.fromJson(reader, InfoSecuriteBean.class);
这是我正在使用的对象class。
import com.google.gson.annotations.SerializedName;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class InfoSecuriteBean {
@SerializedName("IsAuthentif")
private boolean mIsAuthentif = false;
@SerializedName("PrincipalPermissionMode")
private enumPrincipalPermissionMode mPrincipalPermissionMode;
@SerializedName("RoleSGBD")
private List<String> mRoleSGBD;
@SerializedName("RoleSI")
private List<String> mRoleSI;
@SerializedName("Identity")
private String mIdentity = null;
@SerializedName("Password")
private String mPassword = null;
@SerializedName("InfoConsolidee")
private String mInfoConsolidee = null;
@SerializedName("IsAdminM")
private boolean mIsAdminM = false;
@SerializedName("IsAdminI")
private boolean mIsAdminI = false;
@SerializedName("Matricule")
private String mMatricule = null;
@SerializedName("Nom")
private String mNom = null;
@SerializedName("Prenom")
private String mPrenom = null;
@SerializedName("CodeAnalytique")
private String mCodeAnalytique = null;
@SerializedName("Domaine")
private String mDomaine = null;
@SerializedName("Societe")
private String mSociete = null;
@SerializedName("TypeClient")
private String mTypeClient = null;
@SerializedName("HabilitationAD")
private Map<String,List<HabilitationBean>> mHabilitationAD = new HashMap<String, List<HabilitationBean>>();
@SerializedName("HabilitationInterprete")
private Map<String,List<HabilitationBean>> mHabilitationInterprete = new HashMap<String, List<HabilitationBean>>();
//Getter and setter
另一个对象使用
import com.google.gson.annotations.SerializedName;
public class HabilitationBean
{
@SerializedName("Applicatif")
private String mApplicatif = null;
@SerializedName("Role")
private String mRole = null;
@SerializedName("Cle")
private String mCle = null;
@SerializedName("Valeur")
private String mValeur = null;
//getter and setter
但它让我觉得
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECTat line 1 column 60
有什么办法可以解决吗?
谢谢!
编辑
Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 60 path $.HabilitationAD[0]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:200)
at com.google.gson.Gson.fromJson(Gson.java:810)
at com.google.gson.Gson.fromJson(Gson.java:748)
at com.sig.webservice.WebSecurityGBD.doInBackground(WebSecurityGBD.java:69)
at com.sig.webservice.WebSecurityGBD.doInBackground(WebSecurityGBD.java:23)
at android.os.AsyncTask.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 60 path $.HabilitationAD[0]
at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:172)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.read(ReflectiveTypeAdapterFactory.java:103)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:196)
at com.google.gson.Gson.fromJson(Gson.java:810)
at com.google.gson.Gson.fromJson(Gson.java:748)
at com.sig.webservice.WebSecurityGBD.doInBackground(WebSecurityGBD.java:69)
at com.sig.webservice.WebSecurityGBD.doInBackground(WebSecurityGBD.java:23)
at android.os.AsyncTask.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
编辑 2
问题出在两个HashMap>
@SerializedName("HabilitationAD")
private Map<String,List<HabilitationBean>> mHabilitationAD = new HashMap<String, List<HabilitationBean>>();
@SerializedName("HabilitationInterprete")
private Map<String,List<HabilitationBean>> mHabilitationInterprete = new HashMap<String, List<HabilitationBean>>();
如果我评论这个属性我没有任何问题来构建我的 json objet。
我找到了这个linkDeserializing a Map<String, Object> field with Gson
目前我正在尝试这样的事情
public class InfoSecuriteBeanDeserializer implements JsonDeserializer<InfoSecuriteBean> {
@Override
public InfoSecuriteBean deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
JsonArray jArray = (JsonArray) json;
InfoSecuriteBean mInfoSecuriteBean = new InfoSecuriteBean();
for (int i=1; i<jArray.size(); i++) {
JsonObject jObject = (JsonObject) jArray.get(i);
//assuming you have the suitable constructor...
HabilitationBean mHabilitationBean = new HabilitationBean(jObject.get("Applicatif").getAsString(),
jObject.get("Cle").getAsString(),
jObject.get("Role").getAsString(),
jObject.get("Valeur").getAsString());
mInfoSecuriteBean.getmHabilitationAD().add(mHabilitationBean);
}
return mInfoSecuriteBean;
}
}
你认为我能很好地解决我的问题吗?
您遇到的错误很正常。 Gson 不能反序列化嵌套对象。必须编写自己的适配器。
所以你必须学习如何编写自定义反序列化器(非常简单),然后在创建 gson 对象时注册它。
欢迎提出更多问题。
升级到最新的 Gson,它会准确告诉您哪里不匹配。通常,当您的模型有 List
但您的 JSON 没有(即没有 [...]
)时,就会发生这种情况。
我找到了一个简单的解决方案来解决我的问题。我会在这里展示我的解决方案,也许这会对一些人有所帮助。
所以我创建了两个新的 class:HabilitationAD 和 HabilitationInterprete
public class HabilitationAD {
@SerializedName("Key")
private String mKey;
@SerializedName("Value")
private List<BeanHabilitation> mValue;
public String getmKey() {
return mKey;
}
public void setmKey(String mKey) {
this.mKey = mKey;
}
public List<BeanHabilitation> getmValue() {
return mValue;
}
public void setmValue(List<BeanHabilitation> mValue) {
this.mValue = mValue;
}
public HabilitationAD(){
}
public HabilitationAD(String p_mKey, List<BeanHabilitation> p_mValue){
this.mKey = p_mKey;
this.mValue = p_mValue;
}
}
和:
public class HabilitationInterprete {
@SerializedName("Key")
private String mKey;
@SerializedName("Value")
private List<BeanHabilitation> mValue;
public String getmKey() {
return mKey;
}
public void setmKey(String mKey) {
this.mKey = mKey;
}
public List<BeanHabilitation> getmValue() {
return mValue;
}
public void setmValue(List<BeanHabilitation> mValue) {
this.mValue = mValue;
}
public HabilitationInterprete(){
}
public HabilitationInterprete(String p_mKey, List<BeanHabilitation> p_mValue){
this.mKey = p_mKey;
this.mValue = p_mValue;
}
然后我修改我的classInfoSecuriteBean
我改变了这个:
@SerializedName("HabilitationAD")
private Map<String,List<HabilitationBean>> mHabilitationAD = new HashMap<String, List<HabilitationBean>>();
@SerializedName("HabilitationInterprete")
private Map<String,List<HabilitationBean>> mHabilitationInterprete = new HashMap<String, List<HabilitationBean>>();
通过这个 :
@SerializedName("HabilitationAD")
private List<HabilitationAD> habilitationAD;
@SerializedName("HabilitationInterprete")
private List<HabilitationInterprete> habilitationInterprete;
现在一切正常!希望这个解决方案能有所帮助!
刚开始学习gson。 我看到很多关于这个错误的话题,但我没有找到任何帮助或对应我的问题的答案。
我正在尝试解析 JSON 字符串,如下所示:
{
"CodeAnalytique": "XXXX",
"Domaine": "XXXX",
"HabilitationAD": [
{
"Key": "XXXX",
"Value": [
{
"Applicatif": "XXXX",
"Cle": "E",
"Role": "Red",
"Valeur": "XXXX"
},
{
"Applicatif": "XXXX",
"Cle": "E",
"Role": "Red",
"Valeur": "XXXX"
}
//lot of other value
]
}
],
"HabilitationInterprete": [
{
"Key": "XX",
"Value": [
{
"Applicatif": "XXXX",
"Cle": "Z",
"Role": "Red",
"Valeur": "XXX"
},
{
"Applicatif": "XXXX",
"Cle": "Z",
"Role": "Red",
"Valeur": "XXXX"
}
//lot of other value
]
}
],
"Identity": "XXXX",
"InfoConsolidee": "Operation requested at XXXX",
"IsAdminI": true,
"IsAdminM": false,
"IsAuthentif": true,
"Matricule": "XXX",
"Nom": "XXXX",
"PasswordEnvoye": "XXXX",
"Prenom": "XXX",
"PrincipalPermissionMode": 1,
"RoleSGBD": [
"xxxx"
],
"RoleSI": [
null,
"APP_02",
"APP_03",
//lot of other value
],
"Societe": "XXX",
"TypeClient": null
}
成对象
InfoSecuriteBean mInfoSecuriteBean = gson.fromJson(reader, InfoSecuriteBean.class);
这是我正在使用的对象class。
import com.google.gson.annotations.SerializedName;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class InfoSecuriteBean {
@SerializedName("IsAuthentif")
private boolean mIsAuthentif = false;
@SerializedName("PrincipalPermissionMode")
private enumPrincipalPermissionMode mPrincipalPermissionMode;
@SerializedName("RoleSGBD")
private List<String> mRoleSGBD;
@SerializedName("RoleSI")
private List<String> mRoleSI;
@SerializedName("Identity")
private String mIdentity = null;
@SerializedName("Password")
private String mPassword = null;
@SerializedName("InfoConsolidee")
private String mInfoConsolidee = null;
@SerializedName("IsAdminM")
private boolean mIsAdminM = false;
@SerializedName("IsAdminI")
private boolean mIsAdminI = false;
@SerializedName("Matricule")
private String mMatricule = null;
@SerializedName("Nom")
private String mNom = null;
@SerializedName("Prenom")
private String mPrenom = null;
@SerializedName("CodeAnalytique")
private String mCodeAnalytique = null;
@SerializedName("Domaine")
private String mDomaine = null;
@SerializedName("Societe")
private String mSociete = null;
@SerializedName("TypeClient")
private String mTypeClient = null;
@SerializedName("HabilitationAD")
private Map<String,List<HabilitationBean>> mHabilitationAD = new HashMap<String, List<HabilitationBean>>();
@SerializedName("HabilitationInterprete")
private Map<String,List<HabilitationBean>> mHabilitationInterprete = new HashMap<String, List<HabilitationBean>>();
//Getter and setter
另一个对象使用
import com.google.gson.annotations.SerializedName;
public class HabilitationBean
{
@SerializedName("Applicatif")
private String mApplicatif = null;
@SerializedName("Role")
private String mRole = null;
@SerializedName("Cle")
private String mCle = null;
@SerializedName("Valeur")
private String mValeur = null;
//getter and setter
但它让我觉得
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECTat line 1 column 60
有什么办法可以解决吗?
谢谢!
编辑
Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 60 path $.HabilitationAD[0]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:200)
at com.google.gson.Gson.fromJson(Gson.java:810)
at com.google.gson.Gson.fromJson(Gson.java:748)
at com.sig.webservice.WebSecurityGBD.doInBackground(WebSecurityGBD.java:69)
at com.sig.webservice.WebSecurityGBD.doInBackground(WebSecurityGBD.java:23)
at android.os.AsyncTask.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 60 path $.HabilitationAD[0]
at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:172)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.read(ReflectiveTypeAdapterFactory.java:103)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:196)
at com.google.gson.Gson.fromJson(Gson.java:810)
at com.google.gson.Gson.fromJson(Gson.java:748)
at com.sig.webservice.WebSecurityGBD.doInBackground(WebSecurityGBD.java:69)
at com.sig.webservice.WebSecurityGBD.doInBackground(WebSecurityGBD.java:23)
at android.os.AsyncTask.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
编辑 2
问题出在两个HashMap>
@SerializedName("HabilitationAD")
private Map<String,List<HabilitationBean>> mHabilitationAD = new HashMap<String, List<HabilitationBean>>();
@SerializedName("HabilitationInterprete")
private Map<String,List<HabilitationBean>> mHabilitationInterprete = new HashMap<String, List<HabilitationBean>>();
如果我评论这个属性我没有任何问题来构建我的 json objet。
我找到了这个linkDeserializing a Map<String, Object> field with Gson
目前我正在尝试这样的事情
public class InfoSecuriteBeanDeserializer implements JsonDeserializer<InfoSecuriteBean> {
@Override
public InfoSecuriteBean deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
JsonArray jArray = (JsonArray) json;
InfoSecuriteBean mInfoSecuriteBean = new InfoSecuriteBean();
for (int i=1; i<jArray.size(); i++) {
JsonObject jObject = (JsonObject) jArray.get(i);
//assuming you have the suitable constructor...
HabilitationBean mHabilitationBean = new HabilitationBean(jObject.get("Applicatif").getAsString(),
jObject.get("Cle").getAsString(),
jObject.get("Role").getAsString(),
jObject.get("Valeur").getAsString());
mInfoSecuriteBean.getmHabilitationAD().add(mHabilitationBean);
}
return mInfoSecuriteBean;
}
}
你认为我能很好地解决我的问题吗?
您遇到的错误很正常。 Gson 不能反序列化嵌套对象。必须编写自己的适配器。
所以你必须学习如何编写自定义反序列化器(非常简单),然后在创建 gson 对象时注册它。
欢迎提出更多问题。
升级到最新的 Gson,它会准确告诉您哪里不匹配。通常,当您的模型有 List
但您的 JSON 没有(即没有 [...]
)时,就会发生这种情况。
我找到了一个简单的解决方案来解决我的问题。我会在这里展示我的解决方案,也许这会对一些人有所帮助。
所以我创建了两个新的 class:HabilitationAD 和 HabilitationInterprete
public class HabilitationAD {
@SerializedName("Key")
private String mKey;
@SerializedName("Value")
private List<BeanHabilitation> mValue;
public String getmKey() {
return mKey;
}
public void setmKey(String mKey) {
this.mKey = mKey;
}
public List<BeanHabilitation> getmValue() {
return mValue;
}
public void setmValue(List<BeanHabilitation> mValue) {
this.mValue = mValue;
}
public HabilitationAD(){
}
public HabilitationAD(String p_mKey, List<BeanHabilitation> p_mValue){
this.mKey = p_mKey;
this.mValue = p_mValue;
}
}
和:
public class HabilitationInterprete {
@SerializedName("Key")
private String mKey;
@SerializedName("Value")
private List<BeanHabilitation> mValue;
public String getmKey() {
return mKey;
}
public void setmKey(String mKey) {
this.mKey = mKey;
}
public List<BeanHabilitation> getmValue() {
return mValue;
}
public void setmValue(List<BeanHabilitation> mValue) {
this.mValue = mValue;
}
public HabilitationInterprete(){
}
public HabilitationInterprete(String p_mKey, List<BeanHabilitation> p_mValue){
this.mKey = p_mKey;
this.mValue = p_mValue;
}
然后我修改我的classInfoSecuriteBean
我改变了这个:
@SerializedName("HabilitationAD")
private Map<String,List<HabilitationBean>> mHabilitationAD = new HashMap<String, List<HabilitationBean>>();
@SerializedName("HabilitationInterprete")
private Map<String,List<HabilitationBean>> mHabilitationInterprete = new HashMap<String, List<HabilitationBean>>();
通过这个 :
@SerializedName("HabilitationAD")
private List<HabilitationAD> habilitationAD;
@SerializedName("HabilitationInterprete")
private List<HabilitationInterprete> habilitationInterprete;
现在一切正常!希望这个解决方案能有所帮助!