【问题标题】:Gson deserialize LinkedHashmap with nested ObjectsGson 使用嵌套对象反序列化 LinkedHashmap
【发布时间】:2023-04-10 13:25:01
【问题描述】:

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

无法为接口 javax.faces.event.BehaviorListener 调用无参数构造函数。向 Gson 注册该类型的 InstanceCreator 可能会解决此问题。

我已经用 Gson 创建了字符串,所以应该有所有必要的数据。

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

我尝试为我的子类和 AjaxBehavior 创建一个 InstanceCreator,但两者都没有改变任何东西。

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

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
  },
....

【问题讨论】:

    标签: java json gson deserialization


    【解决方案1】:

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

    我必须为 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;
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多