class Demo {
private String name;
private int total;
...
}
当我使用gson序列化demo的对象时,在正常情况下,我会得到类似的东西:
{"name": "hello world", "total": 100}
现在,我有一个注释@Xyz
,可以将其添加到任何类的任何属性中。 (我可以向其应用注释的属性可以是任何东西,但是现在,只要是String
类型,就可以了。)
class Demo {
@Xyz
private String name;
private int total;
...
}
当我在class属性上具有注释时,序列化的数据应采用以下格式:
{"name": {"value": "hello world", "xyzEnabled": true}, "total": 100}
请注意,无论类的类型如何,此注释都可以应用于任何(字符串)字段。如果我能以某种方式在自定义序列化器serialize
方法上获取该特定字段的声明的注释,那将对我有用。
请提供建议以实现此目标。
我认为您打算将annotation 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);
}
}