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的主要内容,如果未能解决你的问题,请参考以下文章

android中的Moshi vs Gson [关闭]

如何通过 Kotlin 中的 gson 访问嵌套 JSON 中的值?

使用 ProGuard 时是不是可以混淆 GSON 注释中的字符串?

Ktor Websocket 功能与 ktor 中的 ContentNeogation 功能 (JSON / GSON)

Gson 转日期中的错误

根据GSON中的值从序列化中排除某些字段