4

我有一个对象列表,比方说:

List<Timestamp>

每个“Timestamp”对象包括其他对象,特别是它有一个“Tag”对象。

class Timestamp {
    String time;
    ...
    Tag tag;
    ...
}

现在,每个 Tag 对象都由“Integer”类型的 ID 标识。

class Tag {
    Integer id;
    ...
}

由于一些原因,我必须使用 Gson 库将整个时间戳列表的 JSON 表示形式写入文件。在某些情况下,我需要每个标签的 ID 的十进制表示,而在其他情况下,我需要十六进制格式的 ID。

如何在两种格式之间“切换”?考虑到要编写 Timestamp 对象的整个列表,我使用以下指令:

ps.println(gson.toJson(timestamps));

而且我不能在 Tag 类中添加其他字段/类型/对象,因为 JSON 表示会不同。

4

2 回答 2

1

我认为这是答案:

  1. 为 Tag 类编写一个自定义的 gson 序列化程序。
  2. 向 Tag 添加一个标志变量,指示何时以十六进制输出 id 以及何时以十进制输出 id。
  3. 在关注新添加的标志的 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.
  }
}

时间戳更新 public void setDisplayIdInDecimal() { tag.setDisplayIdInDecimal(); }

public void setDisplayIdInHex()
{
  tag.setDisplayIdInHex();
}
于 2013-01-31T17:38:48.273 回答
1

AnInteger本身没有格式,它只是一个数字。
如果你想用十六进制格式,你必须使用 aString而不是Integer.

于 2013-01-31T17:30:14.370 回答