Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gson custom serialization for fields with custom annotation

class Demo {
  private String name;
  private int total;

   ...
}

When I'm serializing an object of demo with gson, I'll get something like this in the normal scenario:

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

Now, I have an annotation @Xyz which can be added to any attribute of any class. (The attribute to which I can apply this annotation can be anything, but for now it should be okay if it is just String type )

class Demo {
  @Xyz
  private String name;

  private int total;

  ...
}

When I've the annotation on the class attribute, the serialized data should be of the following format:

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

Please note that this annotation can be applied to any (String) field regardless of the type of the class. If I could somehow get the declared annotations for that specific field on the custom serialiser serialize method, that would work for me.

Please advice how to achieve this.

like image 944
Vijith mv Avatar asked Oct 18 '25 14:10

Vijith mv


1 Answers

I think you meant to use annotation JsonAdapter with your custom behaviour

This is a sample class Xyz which extends 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();
  }
}

this is a sample use

import com.google.gson.annotations.JsonAdapter;

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

I've written some more tests maybe they'll help you to solve this problem more

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);
  }

}
like image 69
DEV-Jacol Avatar answered Oct 20 '25 03:10

DEV-Jacol