代码之家  ›  专栏  ›  技术社区  ›  Dan Ponce

如何使用Gson将对象转换为字符串

  •  0
  • Dan Ponce  · 技术社区  · 8 年前

    我已经使用Gson(2.6.2版)差不多两年了。但从最近几天开始,当我试图将对象转换为字符串时,出现以下错误。

    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());
        }
    }
    

    (我排除了所有的getter和setter)。

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

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

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

    3 回复  |  直到 8 年前
        1
  •  0
  •   Aditya    8 年前

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

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

    希望它能工作!!!

        2
  •  0
  •   Dan Ponce    8 年前

    因此,在网上搜索时,我意识到我必须将@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;
        ....
    

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

        new GsonBuilder()
                .registerTypeAdapter(Date.class, new GsonDefaultTimeZoneAdapter())
                .excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC)
                .excludeFieldsWithoutExposeAnnotation()
                .create();
    
        3
  •  0
  •   Valentin Michalak    8 年前

    您是否已在应用程序中启用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;
    
        //............
    }