【发布时间】: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