序列化和反序列化嵌套类

时间:2014-01-25 16:31:07

标签: java json serialization gson

我正在使用Gson以向后兼容的方式保存我的课程。我有以下单例类,我正在尝试序列化。

public class DataHandler implements Serializable {
      private static DataHandler instance; //SINGLETON
      private HashMap<FormIdentification, BaseForm> forms =
        new HashMap<FormIdentification, BaseForm>();

      public void read(){
        //read the json string
        Gson gson = new Gson();
        instance = gson.fromJson(json, DataHandler.class);      
      }

      public void write(){
        Gson gson = new Gson();
        String json = gson.toJson(instance);
        //write the json string
      }
}

public class FormIdentification implements Serializable{
    public String name, type;
    byte[] id;

    public FormIdentification(String name, String type, byte[] id) {
        this.name = name;
        this.type = type;
        this.id = id;
    }
}

public abstract class BaseForm implements Serializable{
    protected FormIdentification identity;
    protected final List<BaseQuestion> questions = new ArrayList<BaseQuestion>();
    protected final HashMap<String, List<String>> personalData = new HashMap<String, List<String>>();
}

public class LinearForm extends BaseForm {
    private DefaultMutableTreeNode criteria;
}

public abstract class BaseQuestion implements Serializable{
    protected String question;
    protected List<String> possibleAnswers;
}

序列化为以下json:

{
       "forms":{
          "test.Structures.FormIdentification@7b875faa":{
             "criteria":{
                "allowsChildren":true
             },
             "identity":{
                "name":"Mircea",
                "type":"linear",
                "id":[
                   111,
                   119
                ]
             },
             "questions":[

             ],
             "personalData":{
                "Nume":[

                ]
             }
          }
       }
    }

json已完成,并且包含类生成时包含的所有数据。但是当我试图反序列化时,会出现以下错误:

SEVERE: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 12

请注意,它是紧凑格式化的,因此第1行第12列应为:{“forms”:{“test.Structures ...”

我是json的新手,所以我开始寻找解决方案,但我还没找到。我尝试使用TypeToken进行转换,并且我已经开始编写自定义序列化程序,但是没有管理它。我也尝试仅序列化“表单”变量,但它给出了相同的错误。

1 个答案:

答案 0 :(得分:1)

JSON对象是键/值对的集合。值可以是任何JSON值:字符串,数字,对象,数组,true,false或null。但是,JSON对象中的键只能是一个字符串。

当JSON序列化Map<FormIdentification, BaseForm>时,您的密钥为FormIdentification。 GSON可以做的最好的事情就是使用FormIdentification.toString()来获取密钥的字符串。

但是,在JSON反序列化期间,无法知道如何从字符串中获取FormIdentification