gpt4 book ai didi

android - Gson在解析json字符串时将int转换为double

转载 作者:行者123 更新时间:2023-11-30 00:45:29 25 4
gpt4 key购买 nike

我有this JSON 文件放入我的 Assets 中。我正在使用 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 变成了 double。在我的 JSON(第 50 行)中,offset0,但在转换后,它是 0.0。截图:

enter image description here

为什么会这样?如何解决这个问题?

最佳答案

How to fix this?

这不是一个可以解决的问题,也没有什么可担心的。

Why is this happening?

您的 JSON<->Java 映射不提供除最顶层映射之外的任何映射。由于缺少目标类型信息,这使得 Gson 像那样工作,LinkedTreeMap 在内部 使用。从 JSON 格式的角度来看,像 0 这样可能看起来像整数的文字也是合法的浮点值:JSON 规范仅声明 numbers,并且不对“完整性”。由于没有关于反序列化数据类型的足够信息,Gson 应用默认解析策略,并选择 java.lang.Double 作为可以容纳任何其他标准数值的类型,这些数值可以容纳较低的有效位(long 可以很容易地适应 double 的空间;但不确定 Gson 对 BigDecimal 做了什么——JSON 规范似乎没有做出任何规定限制)。所以这只是内部 Gson 表示,您有几个选择:

  • 您可以声明一个甚至可以避免内部 LinkedTreeMap 的映射(通过专用工具编写或生成)。乏味?或许。但在类型安全、javac 控制或您最喜欢的 IDE 导航和建议方面功能更强大。
  • Gson 提供了一堆方法将 JSON 树值转换为目标类型:getAsJsonObject()getAsJsonArray()getAsInt(),以及更多允许以您想要的表示形式获取目标对象。例如,
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 class java.lang.Integer

因为 get("offset").getAsInt() 在内部实现为 return isNumber() ? getAsNumber().intValue() : ...; 用于 JSON 原语。

  • 您可以应用部分映射。例如,您可以提取 date JSON 树并将其转换为具有 private int offset; 字段声明的特殊映射:gson.fromJson(dateJsonObject, DateMapping .class).

同样,Gson 只是没有足够的类型信息并且工作得很好。

关于android - Gson在解析json字符串时将int转换为double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41853066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com