【问题标题】:How to represent integer in hex using Gson?如何使用 Gson 以十六进制表示整数?
【发布时间】:2013-01-31 17:13:17
【问题描述】:

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

List<Timestamp>

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

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

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

class Tag {
    Integer id;
    ...
}

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

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

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

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

【问题讨论】:

  • 如果我理解正确,这似乎不是问题?如果在转换为 JSON 时,您希望 id 是一个整数,它会是。所以......当您不将其转换为 JSON 并且需要十六进制 (String) 表示时,只需将 id 转换为该表示。
  • 问题是我有一个日志文件,其中 ID 可以是整数或十六进制数字。在我的 java 代码中,我有类来关联我解析的对象。此类之一是标签,由于某些原因,id 必须是整数。但是,当日志文件具有十六进制格式的 ID 时会发生什么?我可以将它们解析为整数(根据我的 Tag 类),但我需要将它们导出回十六进制数字。

标签: java json hex gson


【解决方案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.
  }
}

时间戳更新 公共无效 setDisplayIdInDecimal() { tag.setDisplayIdInDecimal(); }

public void setDisplayIdInHex()
{
  tag.setDisplayIdInHex();
}

【讨论】:

  • reuslt 将是您的 json 对象中的 String,例如 {id:"32A44C"}
【解决方案2】:

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

【讨论】:

  • 是的,我知道,但不幸的是我不能使用字符串。我需要整数表示 JSON,除非是 HEX ID。
  • 如果你不能使用String,那么你就不能使用十六进制。十六进制一个字符串。没有其他方法可以表示它。 (参见:json.org“十六进制”搜索页面)。
  • 我的意思是,我不能在我的 Tag 类中直接使用 String,但是如果有办法在编写过程中将我的 ID 从 Integer 更改为 String,那就没问题了。
  • 查看 DwB 的代码,您还可以添加一个内部逻辑前 displayIdInHex,而不是两个 setter 函数。小心,无论谁必须接收 json 都必须同时处理 NumberString 字段 Id
猜你喜欢
  • 2012-08-10
  • 1970-01-01
  • 2021-09-29
  • 2011-10-02
  • 1970-01-01
  • 2013-02-05
  • 2016-03-29
  • 2016-02-06
  • 1970-01-01
相关资源
最近更新 更多