gson中的java.lang.StackOverflowError
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gson中的java.lang.StackOverflowError相关的知识,希望对你有一定的参考价值。
在MVP结构中构建我的应用程序时遇到了一个问题,当我使用Retrofit调用Web服务以响应成功时,我将整个数据传递给json String,这样就会激发我这样做。
我的Log Cat:
FATAL EXCEPTION: main java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:147)
at java.lang.StringBuffer.append(StringBuffer.java:219)
at java.io.StringWriter.write(StringWriter.java:147)
at java.io.StringWriter.append(StringWriter.java:199)
at java.io.StringWriter.append(StringWriter.java:30)
at com.google.gson.stream.JsonWriter.beforeValue(JsonWriter.java:651)
at com.google.gson.stream.JsonWriter.open(JsonWriter.java:325)
at com.google.gson.stream.JsonWriter.beginObject(JsonWriter.java:308)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:205)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:107)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:107)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
这是我的Retrofit API调用:
//API Call for Pitch
public void pitch() {
services
.getAPI()
.pitchList()
.enqueue(new Callback<PitchList_Res>() {
@Override
public void onResponse(Call<PitchList_Res> call, Response<PitchList_Res> response) {
if (!response.body().getdATA().isEmpty()) {
Gson gson1=new Gson();
String json = gson1.toJson(response);
mListener.pitch(json);
}
}
@Override
public void onFailure(Call<PitchList_Res> call, Throwable t) {
call.cancel();
Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show();
}
});
}
这是主要活动,我得到了回复:
//Response of Pitch
@Override
public void pitch(String response_pitch) {
editor.putString(Preference_Data.PITCH_RESPONSE, response_pitch);
editor.commit();
PitchList_Res pitchList_res = gson.fromJson(response_pitch, PitchList_Res.class);
pitchlist.addAll(pitchList_res.getdATA());
for (int i = 0; i < pitchlist.size(); i++) {
View pitchview = getLayoutInflater().inflate(
R.layout.textviewlayout, null);
final TextView tvtitle = (TextView) pitchview
.findViewById(R.id.tv_title);
String id = pitchlist.get(i).getpITCHTYPEID().toString();
tvtitle.setId(Integer.valueOf(id));
tvtitle.setText(pitchlist.get(0).getpITCHSHORT().toString());
tvtitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (stPitchSelectionID != -1) {
findViewById(stPitchSelectionID)
.setBackgroundResource(
R.drawable.btn_bg);
}
if (stPitchSelectionID == v.getId()) {
stPitchSelectionID = -1;
tvtitle.setBackgroundResource(R.drawable.btn_bg);
pitchid = "0";
} else {
stPitchSelectionID = v.getId();
tvtitle.setBackgroundResource(R.drawable.btn_bg_select);
pitchid = String.valueOf(stPitchSelectionID)
.substring(1);
}
}
});
}
}
从Setdefaultvalue()我正在检查我的活动回复:
public void Setdefaultvalue() {
llpitchcontainer.removeAllViews();
llbatresultcontainer.removeAllViews();
llpitchresultcontainer.removeAllViews();
llscoringcontainer.removeAllViews();
etspeed.setText(65 + "");
tvhh.setBackgroundResource(R.drawable.no_toggle);
String response_pitch=pref.getString(Preference_Data.PITCH_RESPONSE,"");
if (response_pitch.equalsIgnoreCase("")) {
mainScoutPresenter.pitch();
Log.e("Pitch_if","Pitch_if");
} else {
pitch(response_pitch);
Log.e("Pitch_else", "Pitch_else");
}
}
这是我的两个模型类:(PitchList_Res)
public class PitchList_Res implements Serializable {
@SerializedName("DATA")
@Expose
private List<PitchList_Data> dATA = null;
public List<PitchList_Data> getdATA() {
return dATA;
}
public void setdATA(List<PitchList_Data> dATA) {
this.dATA = dATA;
}
}
pitch list_data.Java
public class PitchList_Data implements Serializable {
@SerializedName("PITCHTYPEID")
@Expose
private Integer pITCHTYPEID;
@SerializedName("PITCHFULL")
@Expose
private String pITCHFULL;
@SerializedName("PITCHSHORT")
@Expose
private String pITCHSHORT;
public Integer getpITCHTYPEID() {
return pITCHTYPEID;
}
public void setpITCHTYPEID(Integer pITCHTYPEID) {
this.pITCHTYPEID = pITCHTYPEID;
}
public String getpITCHFULL() {
return pITCHFULL;
}
public void setpITCHFULL(String pITCHFULL) {
this.pITCHFULL = pITCHFULL;
}
public String getpITCHSHORT() {
return pITCHSHORT;
}
public void setpITCHSHORT(String pITCHSHORT) {
this.pITCHSHORT = pITCHSHORT;
}
}
答案
我遇到了同样的问题,发现错误是由于Object类中的变量引起的。
我正在解析一个包含内部对象的java类对象,其中一些对象包含Object类型的变量。由于哪个Gson库无法解析该数据。
我已经删除了变量的对象类型声明,问题得到了解决。
我认为如果java对象包含一些泛型类型的变量(就像我的情况下的Object Type),Gson库无法将java对象解析为json。
public class HatchRetailer {
private int id;
private String name;
private String purchaseLink;
private String purchaseLinkDirect;
private String logo;
private String currency;
private double price;
private String stockInfo;
private int stockCount;
private String sourceDate;
private String businessId;
// As per my understanding Gson library is not able to parse variable of type Object
// private Object marketFocus;
// private Object group;
// Setters & Getters
}
以上是关于gson中的java.lang.StackOverflowError的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Kotlin 中的 gson 访问嵌套 JSON 中的值?
使用 ProGuard 时是不是可以混淆 GSON 注释中的字符串?
Ktor Websocket 功能与 ktor 中的 ContentNeogation 功能 (JSON / GSON)