当我尝试将字符串转换为 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 许可协议
你告诉 Gson 它正在寻找一个字符串到对象的映射列表,这实际上是说它要对对象的类型做出最好的猜测。由于 JSON 不区分整数和浮点字段 Gson 必须默认为数字字段的 Float/Double。
Gson 的基本构建是为了检查您要填充的对象的类型,以确定如何解析数据。如果你不给它任何提示,它就不会很好地工作。一种选择是定义自定义 JsonDeserializer,但更好的做法是不使用 HashMap(绝对不要使用 Hashtable!),而是向 Gson 提供有关其期望的数据类型的更多信息。
同样,Gson 的全部意义在于将结构化数据无缝转换为结构化对象。如果你要求它创建一个几乎未定义的结构,比如对象映射列表,那么你就打败了 Gson 的全部要点,还不如使用一些更简单的 JSON 解析器。