如何使用Gson将对象转换为String

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Gson将对象转换为String相关的知识,希望对你有一定的参考价值。

我已经使用Gson(版本2.6.2)差不多两年了。但是在我尝试将对象转换为String时,从最近几天我得到以下错误。

Fatal Exception: java.lang.SecurityException: Can not make a java.lang.reflect.Method constructor accessible

我有这门课:

public class VisitReportModel implements SyncableEntity
{
    private final String LOG_TAG=VisitReportModel.class.getSimpleName();

    private Long Id;
    private Date VisitDate;
    private Date NextVisitDate;
    private String AdvisorId;
    private String ProducerId;
    private Date LastUpdate;
    private List<FieldModel> Fields;
    private Long CropTypeId;
    private String Observations;
    private Boolean Deleted;
    private Integer Year;

    // Local id for searching after upload and set the id received
    private Long LocalId;

    public VisitReportModel()
    {
    }

    public VisitReportModel(VisitReportModel visitReport)
    {
        List<FieldModel> fieldModels = visitReport.getFieldModels();
        Fields = fieldModels;

        setId(visitReport.getId());
        setDeleted(visitReport.getDeleted());
        setVisitDate(visitReport.getVisitDate());
        setNextVisitDate(visitReport.getNextVisitDate());
        setAdvisorId(visitReport.getAdvisorId());
        setProducerId(visitReport.getProducerId());
        setLastUpdate(visitReport.getLastUpdate());
        setLocalId(visitReport.getLocalId());
        setCropTypeId(visitReport.getCropTypeId());
        setObservations(visitReport.getObservations());
        setYear(visitReport.getYear());
    }
}

(我排除了所有的吸气剂和制定者)。

当我尝试将此VisitReportModel对象转换为String(特别是在第二行)时,会发生错误:

Gson gson = new Gson();
String jsonObjectInString = gson.toJson(visitReport);

但奇怪的是,我已经做了很长时间了,现在发生了这个错误,我真的不知道为什么。有人有线索吗?谢谢!

答案

我不知道为什么会出现这种错误,我还在搜索。但我找到了一个对我有用的解决方案。

GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC);
Gson gson = builder.create();

希望它有效!!!

另一答案

因此,通过网络搜索我意识到我必须将@Expose注释添加到我想要序列化/反序列化的所有字段中。所以我的对象像这样结束:

public class VisitReportModel implements SyncableEntity
{
    private final String LOG_TAG=VisitReportModel.class.getSimpleName();
    @Expose
    private Long Id;
    @Expose
    private Date VisitDate;
    @Expose
    private Date NextVisitDate;
    @Expose
    private String AdvisorId;
    @Expose
    private String ProducerId;
    @Expose
    private Date LastUpdate;
    @Expose
    private List<FieldModel> Fields;
    @Expose
    private Long CropTypeId;
    @Expose
    private String Observations;
    @Expose
    private Boolean Deleted;
    @Expose
    private Integer Year;

    // Local id for searching after upload and set the id received
    @Expose
    private Long LocalId;
    ....

在此之后,我向我的GsonBuilder添加了excludeFieldsWithoutExposeAnnotation(),因此只有具有@Expose注释的字段才会被序列化或反序列化:

    new GsonBuilder()
            .registerTypeAdapter(Date.class, new GsonDefaultTimeZoneAdapter())
            .excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC)
            .excludeFieldsWithoutExposeAnnotation()
            .create();
另一答案

您是否在应用程序中启用了proguard,然后尝试以这种方式序列化/反序列化:

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class VisitReportModel implements SyncableEntity
{
    private final String LOG_TAG=VisitReportModel.class.getSimpleName();

    @SerializedName("id")
    @Expose
    private Long Id;

    //............
}

以上是关于如何使用Gson将对象转换为String的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GSON 将 List 转换为 JSON 对象?

java 怎么将对象转换成json字符串

如何将Java对象转换为JSON(Gson)?

java中如何将对象转成json格式字符串

如何使用 Gson 将简单对象转换为字符串? [关闭]

如何正确地将特定对象列表转换为 Gson?