Java Gson到Json的转换

ldxq2e6h  于 2022-11-06  发布在  Java
关注(0)|答案(1)|浏览(195)

我有一个具有以下属性的类,

public AnalyticsEventProperty(String eventID, String key, Object value, EventPropertyValueType valueType) {
        this.eventID = eventID;
        this.key = key;
        this.value = value;
        this.type = valueType();
}

创建此对象并将其传递给一个事件属性数组,当我执行Json转换时,得到以下输出:

{"eventID":"afc970ef-80cf-4d6e-86e6-e8f3a56f26f5","name":"app_start","propertyArrayList":[{"eventID":"afc970ef-80cf-4d6e-86e6-e8f3a56f26f5","key":"session_id","value":"69200430-95a0-4e14-9a36-67942917573d"}

我使用了“key”和“value”,我知道为什么,但我如何使用键和值作为键和值,即“session_id”:“69200430- 95 a0 - 4 e14 - 9a 36 - 67942917573 d”,请记住,这些键和值可能具有不同的属性名称,具体取决于在构造函数中传递的内容。
当我创建String时,我只是调用

String text_to_send = new Gson().toJson(events);

其中事件是数组列表。

1mrurvl1

1mrurvl11#

您可以通过编写一个自定义的TypeAdapterFactory来解决这个问题,它可以为您的类(即基于反射的类)获取默认适配器,并使用它来创建一个JsonObject形式的内存中JSON表示。之后,必须将其写入到X1M3N1X:

class RewritingEventPropertyAdapterFactory implements TypeAdapterFactory {
  public static final RewritingEventPropertyAdapterFactory INSTANCE = new RewritingEventPropertyAdapterFactory();

  private RewritingEventPropertyAdapterFactory() {}

  @Override
  public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
    // Only consider AnalyticsEventProperty or subtypes
    if (!AnalyticsEventProperty.class.isAssignableFrom(type.getRawType())) {
      return null;
    }

    TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
    TypeAdapter<JsonObject> jsonObjectAdapter = gson.getAdapter(JsonObject.class);

    return new TypeAdapter<T>() {
      @Override
      public T read(JsonReader in) throws IOException {
        throw new UnsupportedOperationException("Deserialization is not supported");
      }

      @Override
      public void write(JsonWriter out, T value) throws IOException {
        if (value == null) {
          out.nullValue();
          return;
        }

        JsonObject jsonObject = delegate.toJsonTree(value).getAsJsonObject();

        // Remove "key" and "value"
        String eventKey = jsonObject.remove("key").getAsString();
        JsonElement eventValue = jsonObject.remove("value");

        // Add back an entry in the form of `"key": "value"`
        jsonObject.add(eventKey, eventValue);

        // Write the transformed JsonObject
        jsonObjectAdapter.write(out, jsonObject);
      }
    };
  }
}

然后,您必须使用GsonBuilder注册工厂。
另一种方法是通过直接将属性写入JsonWriter来手动执行类的完整序列化。这很可能会提高性能,但也更容易出错。

相关问题