Gson使用嵌套对象

时间:2017-12-06 09:31:46

标签: java json gson deserialization

我想用Gson反序列化我的Json String。但反序列化我的Json会引发以下错误:

  

无法为接口javax.faces.event.BehaviorListener调用no-args构造函数。使用Gson为此类型注册InstanceCreator可以解决此问题。

我已经使用Gson创建了String,因此应该有所有必要的数据。

我有一个包含几个不同字段的接口的LinkedHashmap。我已经编写了一个自定义序列化程序,我的json代码看起来没问题。我的两个子类使用AjaxBehavior(Listener),我认为这就是问题所在。

我尝试创建子类和AjaxBehavior的InstanceCreator,但两者都没有改变任何内容。

在下面:FormField是我的界面,formMap是我的LinkedHashmap,包含所有数据(工作)。反序列化后,formFields应该是formMap的克隆。当一切正常时,formMap将不存在,而formFields应该从外部Json填充。

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(FormField.class, new FormFieldDeserializer());
builder.registerTypeAdapter(FormField.class, new FormFieldSerializer());
builder.registerTypeAdapter(AjaxBehavior.class, new BehaviorListenerInstanceCreator());
builder.registerTypeAdapter(FormField.class, new CalendarInstanceCreator());
builder.setPrettyPrinting();
Gson gson = builder.create();

String myJson = gson.toJson(formMap);
System.out.println(myJson);


Type listType = new TypeToken<LinkedHashMap<String, FormField>>(){}.getType();
formFields = gson.fromJson(myJson, listType);

我的两个子类使用AjaxBehavior:

public class CalendarField extends FormField {
    private AjaxBehavior ajax;

    private void setupAjax() {
        FacesContext context = FacesContext.getCurrentInstance();

        ajax = (AjaxBehavior) context.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
        ajax.addAjaxBehaviorListener(new InputListener());
        ajax.setTransient(true);
    }

我试图为它制作一个InstanceCreator:

public class BehaviorListenerInstanceCreator implements InstanceCreator<AjaxBehavior> {
    @Override
    public AjaxBehavior createInstance(Type type) {
        FacesContext context = FacesContext.getCurrentInstance();
        AjaxBehavior ajax;
        ajax = (AjaxBehavior) context.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
        ajax.addAjaxBehaviorListener(new InputListener());
        ajax.setTransient(true);

        return ajax;
    }
}

我可以做什么,让我的对象回到LinkedHashmap?

我的JSON看起来像这样:

{
  "MyCal": {
    "type": "CalendarField",
    "ajax": {
      "listeners": [
        {}
      ],
      "transientFlag": true,
      "initialState": false
    },
    "id": "MyCal",
    "label": "Mein Datum",
    "FromTo": false
  },
  "MyNumber": {
    "type": "NumberField",
    "IsYear": false,
    "mask": "999?99",
    "ajax": {
      "listeners": [
        {}
      ],
      "transientFlag": true,
      "initialState": false
    },
    "id": "MyNumber",
    "label": "Eine Nummer",
    "FromTo": false
  },
....

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。

我必须为AjaxBehavior而不是为BehaviorListener创建一个TypeAdapter

builder.registerTypeAdapter(BehaviorListener.class, new BehaviorListenerInstanceCreator());

在内部我返回一个InputListener对象(BehaviorListener的子类)。问题是他想创建一个BehaviorListener的对象,这是一个接口,所以他崩溃了。

public class BehaviorListenerInstanceCreator implements InstanceCreator<BehaviorListener> {
    @Override
    public BehaviorListener createInstance(Type type) {
        InputListener ajax = new InputListener();

        return ajax;
    }
}

也许有人可以使用这些信息;)