问题描述
是否可以通过Gson这样创建json? JSON中包含没有键的javascript函数。
{
autosave: {
save( editor ) {
return editor.saveData( editor.id,editor.getData() );
},waitingTime: 2000
}
谢谢。
解决方法
最后,我找到一种使用TypeAdapterFactory的方法。 这是代码。
class AutosaveAdapter implements TypeAdapterFactory {
@Override
public <T> TypeAdapter<T> create(Gson gson,TypeToken<T> tokenType) {
final TypeAdapter<T> adapter = gson.getDelegateAdapter(this,tokenType);
return new TypeAdapter<T>() {
@Override
public T read(JsonReader reader) throws IOException {
return adapter.read(reader);
}
@Override
public void write(JsonWriter writer,T value) throws IOException {
JsonElement tree = adapter.toJsonTree(value);
if (value instanceof Autosave) {
String dom = value.toString();
JsonObject jo = (JsonObject) tree;
jo.addProperty("autosave",dom );
}
gson.getAdapter(JsonElement.class).write(writer,tree);
}
};
}
}
和
class Autosave {
int waitingTime;
@Expose(serialize = false,deserialize = false)
String name;
@Expose(serialize = false,deserialize = false)
String arguments;
@Expose(serialize = false,deserialize = false)
String body;
Autosave(int waitingTime,String name,String arguments,String body) {
this.waitingTime = waitingTime;
this.name = name;
this.arguments = arguments;
this.body = body;
}
public String toString() {
return "{ waitingTime:" + waitingTime + "," +
name +" ( "+arguments+" ) { " + body + " } "+
"}";
}
}
要测试:
public static void main(String... args) {
Autosave autosave = new Autosave(2000,"save","editor","return editor.saveData( editor.id,editor.getData() );");
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setLenient();
Gson gson = gsonBuilder
.excludeFieldsWithoutExposeAnnotation()
.registerTypeAdapterFactory(new AutosaveAdapter())
.create();
System.out.println(gson.toJson(autosave));
}