如何防止 Gson 将整数表示为浮点数

新手上路,请多包涵

当我尝试将字符串转换为 json 时,Gson 有一些奇怪的行为。下面的代码将字符串草稿转换为 json 响应。有没有办法阻止 gson 将 ‘.0 添加到所有整数值?

 ArrayList<Hashtable<String, Object>> responses;
Type ResponseList = new TypeToken<ArrayList<Hashtable<String, Object>>>() {}.getType();
responses = new Gson().fromJson(draft, ResponseList);

draft:
[ {"id":4077395,"field_id":242566,"body":""},
  {"id":4077398,"field_id":242569,"body":[[273019,0],[273020,1],[273021,0]]},
  {"id":4077399,"field_id":242570,"body":[[273022,0],[273023,1],[273024,0]]}
]

responses:
[ {id=4077395.0, body=, field_id=242566.0},
  {id=4077398.0, body=[[273019.0, 0.0], [273020.0, 1.0], [273021.0, 0.0]], field_id=242569.0},
  {id=4077399.0, body=[[273022.0, 0.0], [273023.0, 1.0], [273024.0, 0.0]], field_id=242570.0}
]

原文由 Mark Murphy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 615
2 个回答

你告诉 Gson 它正在寻找一个字符串到对象的映射列表,这实际上是说它要对对象的类型做出最好的猜测。由于 JSON 不区分整数和浮点字段 Gson 必须默认为数字字段的 Float/Double。

Gson 的基本构建是为了检查您要填充的对象的类型,以确定如何解析数据。如果你不给它任何提示,它就不会很好地工作。一种选择是定义自定义 JsonDeserializer,但更好的做法是不使用 HashMap(绝对不要使用 Hashtable!),而是向 Gson 提供有关其期望的数据类型的更多信息。

 class Response {
  int id;
  int field_id;
  ArrayList<ArrayList<Integer>> body; // or whatever type is most apropriate
}

responses = new Gson()
            .fromJson(draft, new TypeToken<ArrayList<Response>>(){}.getType());

同样,Gson 的全部意义在于将结构化数据无缝转换为结构化对象。如果你要求它创建一个几乎未定义的结构,比如对象映射列表,那么你就打败了 Gson 的全部要点,还不如使用一些更简单的 JSON 解析器。

原文由 dimo414 发布,翻译遵循 CC BY-SA 3.0 许可协议

这有效:

  Gson gson = new GsonBuilder().
        registerTypeAdapter(Double.class,  new JsonSerializer<Double>() {

    @Override
    public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {
        if(src == src.longValue())
            return new JsonPrimitive(src.longValue());
        return new JsonPrimitive(src);
    }
 }).create();

原文由 Martin Wickman 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题