如何通过Gson在json中创建javascript函数?

问题描述

是否可以通过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));
    }