【问题标题】:gson: Add function result to an object created by toJson()gson:将函数结果添加到由 toJson() 创建的对象中
【发布时间】:2013-09-06 22:12:51
【问题描述】:

gson 是一个非常棒的序列化/反序列化工具。使用 toJson 函数获取任意对象的 JSON 表示非常简单。

现在我想将我的对象的数据发送到浏览器以在 javascript/jQuery 中使用。因此,我需要一个额外的 JSON 元素来定义在我的对象中编码为动态/无成员函数的对象的 dom 类

public String buildDomClass()

如何将此字符串添加到我的 toJson 函数创建的字符串中?

有什么想法吗?

非常感谢

【问题讨论】:

    标签: json gson


    【解决方案1】:

    一个简单的方法是将TypeAdapterFactory 和一个接口结合起来。

    首先是您的方法的接口:

      public interface MyInterface {
        public String buildDomClass();
      }
    

    然后是工厂:

    final class MyAdapter implements TypeAdapterFactory {
    
      @Override
      public <T> TypeAdapter<T> create(final Gson gson, final 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 MyInterface) {
              String dom = ((MyInterface) value).buildDomClass();
              JsonObject jo = (JsonObject) tree;
              jo.addProperty("dom", dom );
            }
    
            gson.getAdapter(JsonElement.class).write(writer, tree);
          }
        };
      }
    }
    

    很容易理解,如果你想序列化的对象实现了接口,你委托序列化,然后你添加一个额外的属性来保存你的 DOM。

    如果你不知道,你注册一个这样的工厂

    Gson gson = new GsonBuilder().registerTypeAdapterFactory(new MyAdapter()).create();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2013-06-30
      • 2020-12-20
      • 1970-01-01
      相关资源
      最近更新 更多