使用自定义注释的字段的Gson自定义序列化

维吉斯MV:
class Demo {
  private String name;
  private int total;

   ...
}

当我使用gson序列化demo的对象时,在正常情况下,我会得到如下信息:

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

现在,我有一个注释@Xyz,可以将其添加到任何类的任何属性中。(我可以向其应用注释的属性可以是任何东西,但是现在,只要是Stringtype,就可以了

class Demo {
  @Xyz
  private String name;

  private int total;

  ...
}

当我在class属性上添加注释时,序列化的数据应采用以下格式:

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

请注意,无论类的类型如何,此注释都可以应用于任何(字符串)字段。如果我能以某种方式在自定义序列化程序serialize方法上获取该特定字段的声明的注释,那对我来说将是有效的。

请建议如何实现这一目标。

DEV-Jacol:

我认为您打算将注释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);
  }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章