当我尝试将字符串转换为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解析器。