如何使用Gson表示十六进制中的整数?

我有一个对象列表,让我们说:

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();
}
点赞