我有一个对象列表,让我们说:
List<Timestamp>
每个“时间戳”对象包括其他对象,特别是它具有“标签”对象.
class Timestamp {
String time;
...
Tag tag;
...
}
现在,每个Tag对象都由“Integer”类型的ID标识.
class Tag {
Integer id;
...
}
由于某些原因,我必须使用Gson库将整个时间戳列表的JSON表示写入文件.在某些情况下,我需要每个Tag的ID的十进制表示,而在其他情况下,我需要十六进制格式的ID.
如何在两种格式之间“切换”?考虑到要编写Timestamp对象的完整列表,我使用以下指令:
ps.println(gson.toJson(timestamps));
我不能在Tag类中添加其他字段/类型/对象,因为JSON表示会有所不同.
最佳答案 我想这就是答案:
>为Tag类编写自定义gson序列化程序.
>向Tag添加一个标志变量,指示何时以十六进制输出id以及何时以十进制输出id.
>在Tag类上创建一个注意新添加标志的toString()方法.
自定义序列化程序(来自gson doc示例的变体)
private class TagSerializer implements JsonSerializer<Tag>
{
public JsonElement serialize(Tag src, Type typeOfSrc, JsonSerializationContext context)
{
return new JsonPrimitive(src.toString());
}
}
注册自定义序列化程序
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(Tag.class, new TagSerializer());
标记更新
boolean displayIdInHex = false;
public void setDisplayIdInDecimal()
{
displayIdInHex = false;
}
public void setDisplayIdInHex()
{
displayIdInHex = true;
}
public String toString()
{
... stuff ...
if (displayIdInHex)
{
... output id in hex.
}
else
{
... output id in decimal.
}
}
TimeStamp更新
public void setDisplayIdInDecimal()
{
tag.setDisplayIdInDecimal();
}
public void setDisplayIdInHex()
{
tag.setDisplayIdInHex();
}