Пользовательская сериализация Gson для полей с пользовательской аннотацией - PullRequest
2 голосов
/ 07 апреля 2020
class Demo {
  private String name;
  private int total;

   ...
}

Когда я сериализую демонстрационный объект с помощью gson, я получу что-то вроде этого в обычном сценарии:

{"name": "hello world", "total": 100}

Теперь у меня есть аннотация @Xyz, которая может быть добавленным к любому атрибуту любого класса. (Атрибут, к которому я могу применить эту аннотацию, может быть любым, но сейчас все должно быть в порядке, если это просто String тип)

class Demo {
  @Xyz
  private String name;

  private int total;

  ...
}

Когда у меня есть аннотация к атрибуту класса, сериализованные данные должны иметь следующий формат:

{"name": {"value": "hello world", "xyzEnabled": true}, "total": 100}

Обратите внимание, что эту аннотацию можно применять к любому полю (String) независимо от типа класса. Если бы я мог каким-то образом получить объявленные аннотации для этого указанного поля c в пользовательском методе сериализатора serialize, это бы сработало для меня.

Пожалуйста, посоветуйте, как этого добиться.

1 Ответ

2 голосов
/ 07 апреля 2020

Я думаю, вы намеревались использовать аннотацию JsonAdapter с вашим пользовательским поведением

Это пример класса Xyz, который расширяет JsonSerializer, JsonDeserializer

import com.google.gson.*;

import java.lang.reflect.Type;

public class Xyz implements JsonSerializer<String>, JsonDeserializer<String> {

  @Override
  public JsonElement serialize(String element, Type typeOfSrc, JsonSerializationContext context) {
    JsonObject object = new JsonObject();
    object.addProperty("value", element);
    object.addProperty("xyzEnabled", true);
    return object;
  }

  @Override
  public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    return json.getAsString();
  }
}

это пример использования

import com.google.gson.annotations.JsonAdapter;

public class Demo {
  @JsonAdapter(Xyz.class)
  public String name;
  public int total;
}

Я написал еще несколько тестов, возможно, они помогут вам решить эту проблему подробнее

import com.google.gson.Gson;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class Custom {
  @Test
  public void serializeTest() {
    //given
    Demo demo = new Demo();
    demo.total = 100;
    demo.name = "hello world";
    //when
    String json = new Gson().toJson(demo);
    //then
    assertEquals("{\"name\":{\"value\":\"hello world\",\"xyzEnabled\":true},\"total\":100}", json);
  }

  @Test
  public void deserializeTest() {
    //given
    String json = "{  \"name\": \"hello world\",  \"total\": 100}";
    //when
    Demo demo = new Gson().fromJson(json, Demo.class);
    //then
    assertEquals("hello world", demo.name);
    assertEquals(100, demo.total);
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...