当前位置: 首页 > 面试题库 >

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

易弘亮
2023-03-14
问题内容

当我尝试将字符串转换为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}
]

问题答案:

您是在告诉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解析器。



 类似资料:
  • 问题内容: 我的json中有整数,并且我不希望gson将其转换为双精度。以下内容不起作用: 输出不是我想要的: 有没有办法在我的地图中使用整数而不是双精度? 编辑: 不是我所有的字段都是整数。我已经相应地修改了我的示例。我已经在线阅读了很多示例,包括此站点上的一些答案,但在特定情况下不起作用。 问题答案: 1)您必须创建自定义而不是您的问题。 2)我不认为这种行为来自解串器。它更像是json对象/

  • 问题内容: 我想将浮点数转换为JavaScript中的整数。实际上,我想知道如何同时进行标准转换:截断和舍入。而且有效,而不是通过转换为字符串和解析。 问题答案: 例子 Positive Negative Positive - Larger numbers Negative - Larger numbers

  • 我正在尝试将一个包含“4,3”这样的数字的列转换为数据类型string。 ValueError:无法将字符串转换为浮点数:“4,3”

  • 问题内容: 我试图找到最大的立方根,即整数,小于12,000。 我不确定如何检查它是否是整数!我可以将其转换为字符串,然后使用索引来检查最终值,看看它们是否为零,但这似乎很麻烦。有没有更简单的方法? 问题答案: 要检查浮点值是否为整数,请使用以下方法: 该方法已添加到Python 2.6中的类型中。 请考虑在Python 2中为(整数操作数的底数除法!),并且浮点算术可能不精确(a是使用二进制分数

  • 问题内容: 在Java中,我试图找到一种将浮点数转换为分数字符串的方法。例如: 任何想法如何用Java做到这一点? 问题答案: 最简单的方法可能是使用反复试验。 版画

  • 问题内容: 我最初尝试过此方法,但是未为float64定义%运算符。 问题答案: 假设您的数字适合,则可以将浮点值与转换后的整数值进行比较,以查看它们是否相同: 否则,您可以使用此处详述的功能,例如: 那应该在整个领域内工作。