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

时间:2013-01-31 17:13:17

标签: java json hex gson

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

List<Timestamp>

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

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表示会有所不同。

2 个答案:

答案 0 :(得分:1)

Integer本身没有格式,只是一个数字 如果您想使用十六进制格式,则必须使用String代替Integer

答案 1 :(得分:1)

我认为这就是答案:

  1. 为Tag类编写自定义gson序列化程序。
  2. 向Tag添加一个标志变量,指示何时以十六进制输出id以及何时以十进制输出id。
  3. 在Tag类上创建一个注意新添加标志的toString()方法。
  4. Custom Serializer(来自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();
    }