我将this JSON文件放入资产中。我正在使用Gson将其解析为以下模型类:public class SearchRequest { private ArrayList<String> _source; private int from; private int size; private Object sort; private Object query; public void setFrom(int from) { this.from = from; } public void setSize(int size) { this.size = size; } public void setArtist(String artistName) { Gson gson = new Gson(); JsonObject object = gson.toJsonTree(query).getAsJsonObject(); JsonArray should = object.getAsJsonObject("function_score").getAsJsonObject("query") .getAsJsonObject("bool").getAsJsonArray("should"); should.get(0).getAsJsonObject().getAsJsonObject("match").addProperty("album_artist", artistName); should.get(1).getAsJsonObject().getAsJsonObject("nested").getAsJsonObject("query") .getAsJsonObject("bool").getAsJsonArray("must").get(0).getAsJsonObject() .getAsJsonObject("match").addProperty("tracks.artist", artistName); query = gson.fromJson(object.toString(), query.getClass()); }}当我将此JSON转换为此类的对象时,query对象将成为LinkedTreeMap。但是在此转换中,作为整数的键offset变为双精度。在我的JSON(第50行)中,offset是0,但是转换后是0.0。屏幕截图:为什么会这样呢?如何解决这个问题? 最佳答案 如何解决这个问题?这不是一个固定的主题,也没有什么可担心的。  为什么会这样呢?您的JSON Java映射不提供任何映射,但最顶层的映射除外。由于缺少目标类型信息,因此Gson可以像这样工作,并且LinkedTreeMap在内部使用。从JSON格式的角度来看,像0这样的看起来像整数的文字也是合法的浮点值:JSON规范仅声明数字,并且不对“整数”进行任何更正。由于没有足够的信息来反序列化数据类型,Gson应用了默认的解析策略,并选择java.lang.Double作为可以容纳任何其他标准数值的类型,这些标准数值可以容纳较少的有效位(long可以容纳很容易;但是不确定Gson对double做了什么-JSON规范似乎没有任何限制)。因此,这只是内部Gson表示形式,您可以选择以下几种方式:您可以声明一个映射(由专用工具编写或生成),该映射甚至可以避免内部BigDecimal。乏味?也许。但是在类型安全性,LinkedTreeMap控件或您喜欢的IDE导航和建议方面,功能更多。Gson提供了一堆将JSON树值转换为目标类型的方法:javac,getAsJsonObject(),getAsJsonArray()等,它们允许在所需的表示形式中获取目标对象。例如,final Object value = searchRequest.query .get("function_score").getAsJsonObject() .get("functions").getAsJsonArray() .get(0).getAsJsonObject() .get("linear").getAsJsonObject() .get("date").getAsJsonObject() .get("offset").getAsInt();System.out.println(value + " " + value.getClass());给出:  0类java.lang.Integer因为getAsInt()在内部被实现为JSON原语的get("offset").getAsInt()。您可以应用部分映射。例如,您可以提取return isNumber() ? getAsNumber().intValue() : ...; JSON树并将其转换为声明了date字段的特殊映射:private int offset;。同样,Gson只是没有足够的类型信息,并且确实可以正常工作。
08-04 22:39