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

2022-08-31 11:23:11

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

答案 1

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

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解析器。


答案 2

这有效:

 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();

推荐