12

嗨,我可以将 gson 配置为他使用 int 而不是 double 得到的数据,例如:

{fn: chat, data: {roomId: 1, text: "Some brabble"}}

我有一个 PacketClass 将其反序列化为:

public class DataPacket {
  private String fn;
  private Object p; // will be a StringMap
}

并像这样解码:

DataPacket pkg = gson.fromJson(message, DataPacket.class);

为了更好的类型处理,我得到了 DataPacket.p 字段的数据 pojo,例如:

public class ChatPacket {
  public int roomId;
  public String message;
  public String from;
  // getter & setter
}

要将数据解析为数据包,我使用 BeanMaps 之类的(我删除了错误处理等):

public Object getData(Class<?> pojoClass) {
  pojo = pojoClass.newInstance();
  BeanMap b = new BeanMap();
  b.setBean(pojo);
  b.putAll(this.p);
  pojo = b.getBean();
}

现在的问题是 gson 在 StringMap 中将 roomId: 1 设置为双 1.0 并且 beanmap 尝试将其解析为整数并抛出 NumberFormatException,有人知道如何解决这个问题吗?

谢谢你!

4

1 回答 1

1

我认为您可以简单地将 DataPacket 类更改为

public class DataPacket {
  private String fn;
  private ChatPacket p; // will be a StringMap
}

(用 ChatPacket 替换 Object) - 如果这适合您的应用程序的其余部分。然后,Gson 将识别 ChatPacket 类的数据类型,并将“1”作为 int 进行表征。

编辑(因为您不能在评论中使用完整的格式化功能:-()

您可以像这样使用 Gson 和它的低级助手 JsonParser 的组合:

String testStr = "{fn: chat, data: {roomId: 1, message: \"Some brabble\"}}";
DataPacket dp = new Gson().fromJson(testStr, DataPacket.class); 
JsonParser parser = new JsonParser(); 
JsonElement e = parser.parse(testStr); 
ChatPacket cp = new Gson().fromJson(e.getAsJsonObject().getAsJsonObject("data"), ChatPacket.class);
于 2012-08-22T06:14:26.747 回答