Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class A {
- List<BaseClass> items;
- }
- A obj;
- ........
- gson.toJson(obj);
- class A {
- List<BaseClass> items;
- }
- class BaseClass {
- String field;
- }
- public class CustomSerializer implements JsonSerializer<A> {
- @Override
- public JsonElement serialize(A src, Type type, JsonSerializationContext context) {
- JsonArray items = new JsonArray();
- for (BaseClass item : src.items) {
- if (item.getClass().getSimpleName().equals("BaseClass")) {
- JsonObject currentItem = new JsonObject();
- currentItem.addProperty("field", item.field);
- items.add(currentItem);
- }
- }
- return items;
- }
- }
- GsonBuilder builder = new GsonBuilder();
- builder.registerTypeAdapter(A.class, new CustomSerializer());
- Gson gson = builder.create();
- A obj;
- ........
- gson.toJson(obj);
- class A {
- List<BaseClass> items;
- A(ArrayList<BaseClass> items) {
- this.items = items;
- }
- }
- class BaseClass {
- String field;
- BaseClass(String field) {
- this.field = field;
- }
- }
- public class CustomDeserializer implements JsonDeserializer<A> {
- @Override
- public A deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
- JsonArray items = (JsonArray) json;
- A a = new A(new ArrayList<>());
- for (JsonElement item : items) {
- JsonObject currentItem = new JsonObject();
- BaseClass baseClass = new BaseClass(item.getAsString());
- a.items.add(baseClass);
- }
- return a;
- }
- }
- GsonBuilder builder = new GsonBuilder();
- builder.registerTypeAdapter(A.class, new CustomDeserializer());
- Gson gson = builder.create();
- public class CustomSerializer implements JsonSerializer<A> {
- @Override
- public JsonElement serialize(A src, Type type, JsonSerializationContext context) {
- // Сериализуем поля родителя без изменений
- JsonObject res = (JsonObject)context.serialize(src, src.getClass().getSuperclass());
- // Получаем свои поля
- Field[] flds = src.getClass().getDeclaredFields();
- for (Field fld : flds) {
- Type fldType = fld.getGenericType();
- JsonElement jField;
- Object fieldVal;
- try {
- // Получаем значение поля
- fieldVal = fld.get(src);
- } catch (IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- // Если тип поля List и его наследники и это generic-тип
- if (fld.getType().isAssignableFrom(List.class) && fldType instanceof ParameterizedType) {
- // Получаем конкретные типы, которые были указаны в объявлении List<>
- ParameterizedType paramType = (ParameterizedType)fldType;
- Type[] args = paramType.getActualTypeArguments();
- // формируем массив
- JsonArray jsonArray = new JsonArray();
- for (Object item : (List)fieldVal) {
- // сериализуем элемент списка, как тип, который был указан при объявлении
- JsonObject currentItem = (JsonObject)context.serialize(item, args[0]);
- jsonArray.add(currentItem);
- }
- jField = jsonArray;
- }
- else {
- // Если у нас не список, то вызываем умолчательный сериализатор
- jField = context.serialize(fieldVal);
- }
- res.add(fld.getName(), jField);
- }
- return res;
- }
- }
Add Comment
Please, Sign In to add comment